package app import ( "fmt" "github.com/pkg/errors" ) type MapStr map[string]interface{} func MapStrUnion(dict1 MapStr, dict2 MapStr) MapStr { dict := MapStr{} for k, v := range dict1 { dict[k] = v } for k, v := range dict2 { dict[k] = v } return dict } func (ms *MapStr) UnmarshalYAML(unmarshal func(interface{}) error) error { var result map[interface{}]interface{} err := unmarshal(&result) if err != nil { return errors.WithStack(err) } *ms = cleanUpInterfaceMap(result) return nil } func cleanUpInterfaceArray(in []interface{}) []interface{} { result := make([]interface{}, len(in)) for i, v := range in { result[i] = cleanUpMapValue(v) } return result } func cleanUpInterfaceMap(in map[interface{}]interface{}) MapStr { result := make(MapStr) for k, v := range in { result[fmt.Sprintf("%v", k)] = cleanUpMapValue(v) } return result } func cleanUpMapValue(v interface{}) interface{} { switch v := v.(type) { case []interface{}: return cleanUpInterfaceArray(v) case map[interface{}]interface{}: return cleanUpInterfaceMap(v) case string: return v default: return fmt.Sprintf("%v", v) } }