31 lines
772 B
Go
31 lines
772 B
Go
|
package strslice
|
||
|
|
||
|
import "encoding/json"
|
||
|
|
||
|
// StrSlice represents a string or an array of strings.
|
||
|
// We need to override the json decoder to accept both options.
|
||
|
type StrSlice []string
|
||
|
|
||
|
// UnmarshalJSON decodes the byte slice whether it's a string or an array of
|
||
|
// strings. This method is needed to implement json.Unmarshaler.
|
||
|
func (e *StrSlice) UnmarshalJSON(b []byte) error {
|
||
|
if len(b) == 0 {
|
||
|
// With no input, we preserve the existing value by returning nil and
|
||
|
// leaving the target alone. This allows defining default values for
|
||
|
// the type.
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
p := make([]string, 0, 1)
|
||
|
if err := json.Unmarshal(b, &p); err != nil {
|
||
|
var s string
|
||
|
if err := json.Unmarshal(b, &s); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
p = append(p, s)
|
||
|
}
|
||
|
|
||
|
*e = p
|
||
|
return nil
|
||
|
}
|