dotcloud/docker

View on GitHub
api/types/strslice/strslice.go

Summary

Maintainability
A
0 mins
Test Coverage
package strslice // import "github.com/docker/docker/api/types/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
}