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