tavern/storage/json.go

80 lines
1.8 KiB
Go

package storage
func JSONDeepString(document map[string]interface{}, keys ...string) (string, bool) {
if len(keys) == 1 {
return JSONString(document, keys[0])
}
if len(keys) > 1 {
inner, ok := JSONMap(document, keys[0])
if ok {
return JSONDeepString(inner, keys[1:]...)
}
}
return "", false
}
func JSONMap(document map[string]interface{}, key string) (map[string]interface{}, bool) {
if value, ok := document[key]; ok {
if mapVal, isMap := value.(map[string]interface{}); isMap {
return mapVal, true
}
}
return nil, false
}
func JSONString(document map[string]interface{}, key string) (string, bool) {
if value, ok := document[key]; ok {
if strValue, isString := value.(string); isString {
return strValue, true
}
}
return "", false
}
func JSONStrings(document map[string]interface{}, key string) ([]string, bool) {
var results []string
value, ok := document[key]
if !ok {
return nil, false
}
switch v := value.(type) {
case string:
results = append(results, v)
case []interface{}:
for _, el := range v {
if strValue, isString := el.(string); isString {
results = append(results, strValue)
}
}
}
return results, false
}
func JSONMapList(document map[string]interface{}, key string) ([]map[string]interface{}, bool) {
var results []map[string]interface{}
value, ok := document[key]
if !ok {
return nil, false
}
switch v := value.(type) {
case map[string]interface{}:
results = append(results, v)
case []interface{}:
for _, el := range v {
if mapValue, isMap := el.(map[string]interface{}); isMap {
results = append(results, mapValue)
}
}
}
return results, false
}
func StringsContainsString(things []string, value string) bool {
for _, thing := range things {
if thing == value {
return true
}
}
return false
}