1package kong 2 3import ( 4 "encoding/json" 5 "io" 6 "strings" 7) 8 9// A Resolver resolves a Flag value from an external source. 10type Resolver interface { 11 // Validate configuration against Application. 12 // 13 // This can be used to validate that all provided configuration is valid within this application. 14 Validate(app *Application) error 15 16 // Resolve the value for a Flag. 17 Resolve(context *Context, parent *Path, flag *Flag) (interface{}, error) 18} 19 20// ResolverFunc is a convenience type for non-validating Resolvers. 21type ResolverFunc func(context *Context, parent *Path, flag *Flag) (interface{}, error) 22 23var _ Resolver = ResolverFunc(nil) 24 25func (r ResolverFunc) Resolve(context *Context, parent *Path, flag *Flag) (interface{}, error) { // nolint: golint 26 return r(context, parent, flag) 27} 28func (r ResolverFunc) Validate(app *Application) error { return nil } // nolint: golint 29 30// JSON returns a Resolver that retrieves values from a JSON source. 31// 32// Hyphens in flag names are replaced with underscores. 33func JSON(r io.Reader) (Resolver, error) { 34 values := map[string]interface{}{} 35 err := json.NewDecoder(r).Decode(&values) 36 if err != nil { 37 return nil, err 38 } 39 var f ResolverFunc = func(context *Context, parent *Path, flag *Flag) (interface{}, error) { 40 name := strings.Replace(flag.Name, "-", "_", -1) 41 raw, ok := values[name] 42 if !ok { 43 return nil, nil 44 } 45 return raw, nil 46 } 47 48 return f, nil 49} 50