Path: blob/main/vendor/github.com/spf13/pflag/string_to_string.go
2875 views
package pflag12import (3"bytes"4"encoding/csv"5"fmt"6"sort"7"strings"8)910// -- stringToString Value11type stringToStringValue struct {12value *map[string]string13changed bool14}1516func newStringToStringValue(val map[string]string, p *map[string]string) *stringToStringValue {17ssv := new(stringToStringValue)18ssv.value = p19*ssv.value = val20return ssv21}2223// Format: a=1,b=224func (s *stringToStringValue) Set(val string) error {25var ss []string26n := strings.Count(val, "=")27switch n {28case 0:29return fmt.Errorf("%s must be formatted as key=value", val)30case 1:31ss = append(ss, strings.Trim(val, `"`))32default:33r := csv.NewReader(strings.NewReader(val))34var err error35ss, err = r.Read()36if err != nil {37return err38}39}4041out := make(map[string]string, len(ss))42for _, pair := range ss {43kv := strings.SplitN(pair, "=", 2)44if len(kv) != 2 {45return fmt.Errorf("%s must be formatted as key=value", pair)46}47out[kv[0]] = kv[1]48}49if !s.changed {50*s.value = out51} else {52for k, v := range out {53(*s.value)[k] = v54}55}56s.changed = true57return nil58}5960func (s *stringToStringValue) Type() string {61return "stringToString"62}6364func (s *stringToStringValue) String() string {65keys := make([]string, 0, len(*s.value))66for k := range *s.value {67keys = append(keys, k)68}69sort.Strings(keys)7071records := make([]string, 0, len(*s.value)>>1)72for _, k := range keys {73v := (*s.value)[k]74records = append(records, k+"="+v)75}7677var buf bytes.Buffer78w := csv.NewWriter(&buf)79if err := w.Write(records); err != nil {80panic(err)81}82w.Flush()83return "[" + strings.TrimSpace(buf.String()) + "]"84}8586func stringToStringConv(val string) (interface{}, error) {87val = strings.Trim(val, "[]")88// An empty string would cause an empty map89if len(val) == 0 {90return map[string]string{}, nil91}92r := csv.NewReader(strings.NewReader(val))93ss, err := r.Read()94if err != nil {95return nil, err96}97out := make(map[string]string, len(ss))98for _, pair := range ss {99kv := strings.SplitN(pair, "=", 2)100if len(kv) != 2 {101return nil, fmt.Errorf("%s must be formatted as key=value", pair)102}103out[kv[0]] = kv[1]104}105return out, nil106}107108// GetStringToString return the map[string]string value of a flag with the given name109func (f *FlagSet) GetStringToString(name string) (map[string]string, error) {110val, err := f.getFlagType(name, "stringToString", stringToStringConv)111if err != nil {112return map[string]string{}, err113}114return val.(map[string]string), nil115}116117// StringToStringVar defines a string flag with specified name, default value, and usage string.118// The argument p points to a map[string]string variable in which to store the values of the multiple flags.119// The value of each argument will not try to be separated by comma120func (f *FlagSet) StringToStringVar(p *map[string]string, name string, value map[string]string, usage string) {121f.VarP(newStringToStringValue(value, p), name, "", usage)122}123124// StringToStringVarP is like StringToStringVar, but accepts a shorthand letter that can be used after a single dash.125func (f *FlagSet) StringToStringVarP(p *map[string]string, name, shorthand string, value map[string]string, usage string) {126f.VarP(newStringToStringValue(value, p), name, shorthand, usage)127}128129// StringToStringVar defines a string flag with specified name, default value, and usage string.130// The argument p points to a map[string]string variable in which to store the value of the flag.131// The value of each argument will not try to be separated by comma132func StringToStringVar(p *map[string]string, name string, value map[string]string, usage string) {133CommandLine.VarP(newStringToStringValue(value, p), name, "", usage)134}135136// StringToStringVarP is like StringToStringVar, but accepts a shorthand letter that can be used after a single dash.137func StringToStringVarP(p *map[string]string, name, shorthand string, value map[string]string, usage string) {138CommandLine.VarP(newStringToStringValue(value, p), name, shorthand, usage)139}140141// StringToString defines a string flag with specified name, default value, and usage string.142// The return value is the address of a map[string]string variable that stores the value of the flag.143// The value of each argument will not try to be separated by comma144func (f *FlagSet) StringToString(name string, value map[string]string, usage string) *map[string]string {145p := map[string]string{}146f.StringToStringVarP(&p, name, "", value, usage)147return &p148}149150// StringToStringP is like StringToString, but accepts a shorthand letter that can be used after a single dash.151func (f *FlagSet) StringToStringP(name, shorthand string, value map[string]string, usage string) *map[string]string {152p := map[string]string{}153f.StringToStringVarP(&p, name, shorthand, value, usage)154return &p155}156157// StringToString defines a string flag with specified name, default value, and usage string.158// The return value is the address of a map[string]string variable that stores the value of the flag.159// The value of each argument will not try to be separated by comma160func StringToString(name string, value map[string]string, usage string) *map[string]string {161return CommandLine.StringToStringP(name, "", value, usage)162}163164// StringToStringP is like StringToString, but accepts a shorthand letter that can be used after a single dash.165func StringToStringP(name, shorthand string, value map[string]string, usage string) *map[string]string {166return CommandLine.StringToStringP(name, shorthand, value, usage)167}168169170