forked from cli/cli
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathresolver.go
More file actions
154 lines (127 loc) · 2.94 KB
/
resolver.go
File metadata and controls
154 lines (127 loc) · 2.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package resolver
import (
"errors"
"os"
"github.com/cli/cli/internal/config"
"github.com/spf13/cobra"
)
type Strat func() (interface{}, error)
type ResolverFunction func() (interface{}, error)
type Resolver struct {
strats map[string][]Strat
}
func New() *Resolver {
return &Resolver{
strats: make(map[string][]Strat),
}
}
func (r *Resolver) AddStrat(name string, strat Strat) {
r.strats[name] = append(r.strats[name], strat)
}
func (r *Resolver) GetStrats(name string) []Strat {
return r.strats[name]
}
func (r *Resolver) ResolverFunc(name string) ResolverFunction {
return ResolverFunc(r.GetStrats(name)...)
}
func (r *Resolver) Resolve(name string) (interface{}, error) {
return ResolverFunc(r.GetStrats(name)...)()
}
func ResolverFunc(strategies ...Strat) ResolverFunction {
return func() (interface{}, error) {
for _, strat := range strategies {
out, err := strat()
if err != nil {
return nil, err
}
if out != nil {
return out, nil
}
}
return "", errors.New("No strategies resulted in output")
}
}
func EnvStrat(name string) Strat {
return func() (interface{}, error) {
val, ok := os.LookupEnv(name)
if !ok {
return nil, nil
} else {
return val, nil
}
}
}
func ConfigStrat(config func() (config.Config, error), hostname, name string) Strat {
return func() (interface{}, error) {
cfg, err := config()
if err != nil {
return nil, err
}
return cfg.Get(hostname, name)
}
}
func ArgsStrat(args []string, index int) Strat {
return func() (interface{}, error) {
if len(args) > index {
return args[index], nil
}
return nil, nil
}
}
func StringFlagStrat(cmd *cobra.Command, name string) Strat {
return func() (interface{}, error) {
if !cmd.Flags().Changed(name) {
return nil, nil
}
return cmd.Flags().GetString(name)
}
}
func BoolFlagStrat(cmd *cobra.Command, name string) Strat {
return func() (interface{}, error) {
return cmd.Flags().GetBool(name)
}
}
func StringSliceFlagsStrat(cmd *cobra.Command, name string) Strat {
return func() (interface{}, error) {
if !cmd.Flags().Changed(name) {
return nil, nil
}
return cmd.Flags().GetStringSlice(name)
}
}
func MutuallyExclusiveBoolFlagsStrat(cmd *cobra.Command, names ...string) Strat {
return func() (interface{}, error) {
flags := cmd.Flags()
enabledFlagCount := 0
enabledFlag := ""
for _, name := range names {
val, err := flags.GetBool(name)
if err != nil {
return nil, err
}
if val {
enabledFlagCount = enabledFlagCount + 1
enabledFlag = name
}
if enabledFlagCount > 1 {
break
}
}
if enabledFlagCount == 0 {
return nil, nil
} else if enabledFlagCount == 1 {
return enabledFlag, nil
}
return nil, errors.New("expected exactly one of boolean flags to be true")
}
}
func ValueStrat(name string) Strat {
return func() (interface{}, error) {
return name, nil
}
}
func ErrorStrat(err error) Strat {
return func() (interface{}, error) {
return nil, err
}
}