| // Copyright 2018 Google LLC | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| package main | |
| import ( | |
| "encoding/json" | |
| "fmt" | |
| "strings" | |
| ) | |
| // mapVar implements flag.Value for a map flag variable. Example: | |
| // "-my-map a=A,b=B,c=C" results in {"a": "A", "b": "B", "c": "C"} | |
| type mapVar struct { | |
| m map[string]string | |
| } | |
| // newMapVar returns an empty mapVar. | |
| func newMapVar() *mapVar { | |
| return &mapVar{make(map[string]string)} | |
| } | |
| // String implements flag.Value.String. | |
| func (mv *mapVar) String() string { | |
| mapJSON, _ := json.Marshal(mv.m) | |
| return string(mapJSON) | |
| } | |
| // Set implements flag.Value.Set. It parses the given string and adds the encoded map values to the mapVar. | |
| func (mv *mapVar) Set(s string) error { | |
| pairs := strings.Split(s, ",") | |
| for _, pair := range pairs { | |
| split := strings.SplitN(pair, "=", 2) | |
| if len(split) != 2 { | |
| return fmt.Errorf("item %q is improperly formatted; does it have an '=' character?", pair) | |
| } | |
| mv.m[split[0]] = split[1] | |
| } | |
| return nil | |
| } | |
| // listVar implements flag.Value for a list flag variable. Example: | |
| // "-my-list a,b,c,d" results in {"a", "b", "c", "d"} | |
| type listVar struct { | |
| l []string | |
| } | |
| // String implements flag.Value.String. | |
| func (lv *listVar) String() string { | |
| listJSON, _ := json.Marshal(lv.l) | |
| return string(listJSON) | |
| } | |
| // Set implements flag.Value.Set. It parses the given string and adds the encoded list values to the listVar. | |
| func (lv *listVar) Set(s string) error { | |
| list := strings.Split(s, ",") | |
| lv.l = append(lv.l, list...) | |
| return nil | |
| } |