73a3699ea0
This enables properties to be mapped to arbitrary names, as is needed to translate strongly typed capability references into string CF IDs.
52 lines
1.4 KiB
Go
52 lines
1.4 KiB
Go
// Copyright 2016 Marapongo, Inc. All rights reserved.
|
|
|
|
package encoding
|
|
|
|
// StringSlice checks a weakly typed interface ptr to see if it's a []string; if yes, the resulting converted array
|
|
// is returned with a "true"; otherwise, nil with a "false" is returned. A copy may be made if needed.
|
|
func StringSlice(i interface{}) ([]string, bool) {
|
|
// First try a direct conversion.
|
|
if s, ok := i.([]string); ok {
|
|
return s, true
|
|
}
|
|
|
|
// Otherwise, see if it's an untyped array, and then convert each element.
|
|
if a, ok := i.([]interface{}); ok {
|
|
ss := make([]string, 0, len(a))
|
|
for _, e := range a {
|
|
if s, ok := e.(string); ok {
|
|
ss = append(ss, s)
|
|
} else {
|
|
return nil, false
|
|
}
|
|
}
|
|
return ss, true
|
|
}
|
|
|
|
return nil, false
|
|
}
|
|
|
|
// StringStringMap checks a weakly typed interface ptr to see if it's a map[string]string; if yes, the result is
|
|
// returned with a "true"; otherwise, nil with a "false" is returned. A copy may be made if needed.
|
|
func StringStringMap(i interface{}) (map[string]string, bool) {
|
|
// First try a direct conversion.
|
|
if ssm, ok := i.(map[string]string); ok {
|
|
return ssm, true
|
|
}
|
|
|
|
// Otherwise, see if the keys are strings but the value type itself is unknown.
|
|
if sim, ok := i.(map[string]interface{}); ok {
|
|
ssm := make(map[string]string)
|
|
for k, v := range sim {
|
|
if s, ok := v.(string); ok {
|
|
ssm[k] = s
|
|
} else {
|
|
return nil, false
|
|
}
|
|
}
|
|
return ssm, true
|
|
}
|
|
|
|
return nil, false
|
|
}
|