package types import ( "fmt" "reflect" "strings" ) // EnumParser parses "enum" values; i.e. a predefined set of strings to // predefined values. type EnumParser struct { Type string // type name; if not set, use type of first value added CaseMatch bool // if true, matching of strings is case-sensitive // PrefixMatch bool vals map[string]interface{} } // AddVals adds strings and values to an EnumParser. func (ep *EnumParser) AddVals(vals map[string]interface{}) { if ep.vals == nil { ep.vals = make(map[string]interface{}) } for k, v := range vals { if ep.Type == "" { ep.Type = reflect.TypeOf(v).Name() } if !ep.CaseMatch { k = strings.ToLower(k) } ep.vals[k] = v } } // Parse parses the string and returns the value or an error. func (ep EnumParser) Parse(s string) (interface{}, error) { if !ep.CaseMatch { s = strings.ToLower(s) } v, ok := ep.vals[s] if !ok { return false, fmt.Errorf("failed to parse %s %#q", ep.Type, s) } return v, nil }