62 lines
1.1 KiB
Go
62 lines
1.1 KiB
Go
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)
|
|
}
|
|
}
|