github.com/tcnksm/gcli@v0.2.4-0.20170129033839-7eb950507e5a/command/flag_flag.go (about) 1 package command 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/tcnksm/gcli/skeleton" 8 ) 9 10 const ( 11 // defaultTypeString is default flag type 12 defaultTypeString = "string" 13 ) 14 15 // FlagFlag implements the flag.Value interface and allows multiple 16 // calls to the same variable to append a list. It parses string and set them 17 // as skeleton.Flag. 18 type FlagFlag []*skeleton.Flag 19 20 // String 21 func (f *FlagFlag) String() string { 22 return "" 23 } 24 25 // Set parses input string and appends it on FlagdFlag. 26 // Input format must be NAME:TYPE:SYNOPSIS format. 27 func (f *FlagFlag) Set(v string) error { 28 flgStrs := strings.Split(v, ",") 29 30 for _, flgStr := range flgStrs { 31 32 parsedFlgStr := strings.Split(flgStr, ":") 33 if len(parsedFlgStr) > 3 { 34 return fmt.Errorf("flag must be specified by NAME:TYPE:DESCRIPTION format") 35 } 36 37 name := parsedFlgStr[0] 38 typeString := defaultTypeString 39 desc := "" 40 41 if len(parsedFlgStr) > 1 { 42 typeString = parsedFlgStr[1] 43 } 44 45 if len(parsedFlgStr) > 2 { 46 desc = parsedFlgStr[2] 47 48 // Delete unnessary characters 49 // TODO, this should not here..? or extract this as other function 50 desc = strings.Trim(desc, "\"") 51 desc = strings.Trim(desc, "'") 52 } 53 54 flag := &skeleton.Flag{ 55 LongName: name, 56 TypeString: typeString, 57 Description: desc, 58 } 59 60 // Fix inputs string for using main processing 61 if err := flag.Fix(); err != nil { 62 return err 63 } 64 65 *f = append(*f, flag) 66 } 67 68 return nil 69 }