/
flags.go
96 lines (82 loc) · 2.1 KB
/
flags.go
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
package command
import (
"fmt"
"sort"
"strings"
"github.com/lunarway/release-manager/internal/grafana"
"github.com/pkg/errors"
)
func mapGrafanaOptionsToEnvironment(opts *grafanaOptions) map[string]grafana.Environment {
environments := make(map[string]grafana.Environment)
for env, config := range *opts {
environments[env] = grafana.Environment{
APIKey: config.APIKey,
BaseURL: config.URL,
}
}
return environments
}
type grafanaConfig struct {
URL string
APIKey string
}
type grafanaOptions map[string]grafanaConfig
func (opts *grafanaOptions) String() string {
values := opts.GetSlice()
if len(values) == 0 {
return "[]"
}
return strings.Join(values, ",")
}
func (opts *grafanaOptions) Type() string {
return "<env>=<api-key>=<url>"
}
func (opts *grafanaOptions) Set(csv string) error {
for _, split := range strings.Split(csv, ",") {
err := opts.Append(split)
if err != nil {
return fmt.Errorf("flag value '%s': %w", split, err)
}
}
return nil
}
// GetSlice returns the flag value list as an array of strings.
func (opts *grafanaOptions) GetSlice() []string {
var values []string
for env, value := range *opts {
values = append(values, fmt.Sprintf("%s=<redacted>=%s", env, value.URL))
}
sort.Strings(values)
return values
}
// Append adds the specified value to the end of the flag value list.
func (opts *grafanaOptions) Append(value string) error {
env, config, err := parseGrafanaConfig(value)
if err != nil {
return err
}
(*opts)[env] = config
return nil
}
// Replace will fully overwrite any data currently in the flag value list.
func (opts *grafanaOptions) Replace(values []string) error {
newOpts := grafanaOptions{}
for _, value := range values {
err := newOpts.Append(value)
if err != nil {
return err
}
}
*opts = newOpts
return nil
}
func parseGrafanaConfig(value string) (string, grafanaConfig, error) {
splits := strings.SplitN(value, "=", 3)
if len(splits) < 3 {
return "", grafanaConfig{}, errors.New("value must be formatted as <env>=<api-key>=<url>")
}
return splits[0], grafanaConfig{
APIKey: splits[1],
URL: splits[2],
}, nil
}