Skip to content

Commit 747a83a

Browse files
committed
internal/cmdlets: Add improved I/O to remap command
1 parent be4065f commit 747a83a

File tree

1 file changed

+86
-60
lines changed

1 file changed

+86
-60
lines changed

internal/cmdlets/fms_remap.go

Lines changed: 86 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"os"
1212
"sort"
1313
"strconv"
14+
"strings"
1415

1516
"github.com/AlecAivazis/survey/v2"
1617
"github.com/spf13/cobra"
@@ -30,6 +31,7 @@ table. This will disrupt any teams currently on the fms!`
3031

3132
func init() {
3233
fmsCmd.AddCommand(fmsRemapCmd)
34+
fmsRemapCmd.Flags().Bool("clear", false, "Clear all mappings")
3335
}
3436

3537
func fmsRemapCmdRun(c *cobra.Command, args []string) {
@@ -38,81 +40,105 @@ func fmsRemapCmdRun(c *cobra.Command, args []string) {
3840
fAddr = "localhost:8080"
3941
}
4042

41-
r, err := http.Get("http://" + fAddr + "/admin/cfg/quads")
42-
if err != nil {
43-
fmt.Fprintf(os.Stderr, "Error getting quads: %s\n", err)
44-
os.Exit(2)
45-
}
43+
promptQuads := func() map[string]string {
44+
r, err := http.Get("http://" + fAddr + "/admin/cfg/quads")
45+
if err != nil {
46+
fmt.Fprintf(os.Stderr, "Error getting quads: %s\n", err)
47+
os.Exit(2)
48+
}
4649

47-
quads := []string{}
48-
if err := json.NewDecoder(r.Body).Decode(&quads); err != nil {
49-
fmt.Fprintf(os.Stderr, "Error getting quads: %s\n", err)
50-
os.Exit(2)
51-
}
52-
sort.Strings(quads)
53-
r.Body.Close()
50+
quads := []string{}
51+
if err := json.NewDecoder(r.Body).Decode(&quads); err != nil {
52+
fmt.Fprintf(os.Stderr, "Error getting quads: %s\n", err)
53+
os.Exit(2)
54+
}
55+
sort.Strings(quads)
56+
r.Body.Close()
5457

55-
r, err = http.Get("http://" + fAddr + "/admin/map/current")
56-
if err != nil {
57-
fmt.Fprintf(os.Stderr, "Error getting map: %s\n", err)
58-
os.Exit(2)
59-
}
58+
r, err = http.Get("http://" + fAddr + "/admin/map/current")
59+
if err != nil {
60+
fmt.Fprintf(os.Stderr, "Error getting map: %s\n", err)
61+
os.Exit(2)
62+
}
6063

61-
cMap := make(map[string]string)
62-
if err := json.NewDecoder(r.Body).Decode(&cMap); err != nil {
63-
fmt.Fprintf(os.Stderr, "Error getting map: %s\n", err)
64-
os.Exit(2)
65-
}
66-
ccMap := make(map[string]string, len(cMap))
67-
r.Body.Close()
68-
69-
if len(cMap) > 0 {
70-
fmt.Println("Current Mapping:")
71-
for team, quad := range cMap {
72-
fmt.Printf(" %s:\t%s\n", quad, team)
73-
ccMap[quad] = team
64+
cMap := make(map[string]string)
65+
if err := json.NewDecoder(r.Body).Decode(&cMap); err != nil {
66+
fmt.Fprintf(os.Stderr, "Error getting map: %s\n", err)
67+
os.Exit(2)
7468
}
75-
fmt.Println()
76-
}
77-
fmt.Println("Enter new mapping")
69+
ccMap := make(map[string]string, len(cMap))
70+
r.Body.Close()
71+
72+
if len(cMap) > 0 {
73+
fmt.Println("Current Mapping:")
74+
for team, quad := range cMap {
75+
fmt.Printf(" %s:\t%s\n", quad, team)
76+
ccMap[quad] = team
77+
}
78+
fmt.Println()
79+
}
80+
fmt.Println("Enter new mapping")
7881

79-
tNumValidator := func(a interface{}) error {
80-
if a.(string) == "-" {
82+
tNumValidator := func(a interface{}) error {
83+
if a.(string) == "-" {
84+
return nil
85+
}
86+
if _, err := strconv.Atoi(a.(string)); err != nil {
87+
88+
return errors.New("team number must be a number")
89+
}
8190
return nil
8291
}
83-
if _, err := strconv.Atoi(a.(string)); err != nil {
92+
qMap := []*survey.Question{}
93+
for _, quad := range quads {
94+
qMap = append(qMap, &survey.Question{
95+
Name: quad,
96+
Validate: tNumValidator,
97+
Prompt: &survey.Input{
98+
Message: quad,
99+
Default: ccMap[quad],
100+
},
101+
})
102+
}
84103

85-
return errors.New("team number must be a number")
104+
nMap := make(map[string]interface{})
105+
if err := survey.Ask(qMap, &nMap); err != nil {
106+
fmt.Fprintf(os.Stderr, "Error polling for fields: %s\n", err)
107+
os.Exit(2)
108+
}
109+
nnMap := make(map[string]string, len(nMap))
110+
for f, t := range nMap {
111+
if t == "-" {
112+
continue
113+
}
114+
nnMap[t.(string)] = f
86115
}
87-
return nil
88-
}
89-
qMap := []*survey.Question{}
90-
for _, quad := range quads {
91-
qMap = append(qMap, &survey.Question{
92-
Name: quad,
93-
Validate: tNumValidator,
94-
Prompt: &survey.Input{
95-
Message: quad,
96-
Default: ccMap[quad],
97-
},
98-
})
99-
}
100116

101-
nMap := make(map[string]interface{})
102-
if err := survey.Ask(qMap, &nMap); err != nil {
103-
fmt.Fprintf(os.Stderr, "Error polling for fields: %s\n", err)
104-
os.Exit(2)
117+
return nnMap
105118
}
106119

107-
nnMap := make(map[string]string, len(nMap))
108-
for f, t := range nMap {
109-
if t == "-" {
110-
continue
120+
mapping := make(map[string]string)
121+
clear, _ := c.Flags().GetBool("clear")
122+
123+
switch {
124+
case clear:
125+
// Don't do anything for clear, just return the empty
126+
// mapping.
127+
case len(args) > 0:
128+
// Parse the args as string pairs of the form
129+
// fieldN:quad:team
130+
for _, a := range args {
131+
parts := strings.Split(a, ":")
132+
if len(parts) != 3 {
133+
continue
134+
}
135+
mapping[parts[2]] = strings.Join(parts[:2], ":")
111136
}
112-
nnMap[t.(string)] = f
137+
default:
138+
mapping = promptQuads()
113139
}
114140

115141
buf := new(bytes.Buffer)
116-
json.NewEncoder(buf).Encode(nnMap)
142+
json.NewEncoder(buf).Encode(mapping)
117143
http.Post("http://"+fAddr+"/admin/map/immediate", "application/json", buf)
118144
}

0 commit comments

Comments
 (0)