@@ -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
3132func init () {
3233 fmsCmd .AddCommand (fmsRemapCmd )
34+ fmsRemapCmd .Flags ().Bool ("clear" , false , "Clear all mappings" )
3335}
3436
3537func 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