1package pflag 2 3import ( 4 "encoding/hex" 5 "fmt" 6 "strings" 7) 8 9// BytesHex adapts []byte for use as a flag. Value of flag is HEX encoded 10type bytesHexValue []byte 11 12func (bytesHex bytesHexValue) String() string { 13 return fmt.Sprintf("%X", []byte(bytesHex)) 14} 15 16func (bytesHex *bytesHexValue) Set(value string) error { 17 bin, err := hex.DecodeString(strings.TrimSpace(value)) 18 19 if err != nil { 20 return err 21 } 22 23 *bytesHex = bin 24 25 return nil 26} 27 28func (*bytesHexValue) Type() string { 29 return "bytesHex" 30} 31 32func newBytesHexValue(val []byte, p *[]byte) *bytesHexValue { 33 *p = val 34 return (*bytesHexValue)(p) 35} 36 37func bytesHexConv(sval string) (interface{}, error) { 38 39 bin, err := hex.DecodeString(sval) 40 41 if err == nil { 42 return bin, nil 43 } 44 45 return nil, fmt.Errorf("invalid string being converted to Bytes: %s %s", sval, err) 46} 47 48// GetBytesHex return the []byte value of a flag with the given name 49func (f *FlagSet) GetBytesHex(name string) ([]byte, error) { 50 val, err := f.getFlagType(name, "bytesHex", bytesHexConv) 51 52 if err != nil { 53 return []byte{}, err 54 } 55 56 return val.([]byte), nil 57} 58 59// BytesHexVar defines an []byte flag with specified name, default value, and usage string. 60// The argument p points to an []byte variable in which to store the value of the flag. 61func (f *FlagSet) BytesHexVar(p *[]byte, name string, value []byte, usage string) { 62 f.VarP(newBytesHexValue(value, p), name, "", usage) 63} 64 65// BytesHexVarP is like BytesHexVar, but accepts a shorthand letter that can be used after a single dash. 66func (f *FlagSet) BytesHexVarP(p *[]byte, name, shorthand string, value []byte, usage string) { 67 f.VarP(newBytesHexValue(value, p), name, shorthand, usage) 68} 69 70// BytesHexVar defines an []byte flag with specified name, default value, and usage string. 71// The argument p points to an []byte variable in which to store the value of the flag. 72func BytesHexVar(p *[]byte, name string, value []byte, usage string) { 73 CommandLine.VarP(newBytesHexValue(value, p), name, "", usage) 74} 75 76// BytesHexVarP is like BytesHexVar, but accepts a shorthand letter that can be used after a single dash. 77func BytesHexVarP(p *[]byte, name, shorthand string, value []byte, usage string) { 78 CommandLine.VarP(newBytesHexValue(value, p), name, shorthand, usage) 79} 80 81// BytesHex defines an []byte flag with specified name, default value, and usage string. 82// The return value is the address of an []byte variable that stores the value of the flag. 83func (f *FlagSet) BytesHex(name string, value []byte, usage string) *[]byte { 84 p := new([]byte) 85 f.BytesHexVarP(p, name, "", value, usage) 86 return p 87} 88 89// BytesHexP is like BytesHex, but accepts a shorthand letter that can be used after a single dash. 90func (f *FlagSet) BytesHexP(name, shorthand string, value []byte, usage string) *[]byte { 91 p := new([]byte) 92 f.BytesHexVarP(p, name, shorthand, value, usage) 93 return p 94} 95 96// BytesHex defines an []byte flag with specified name, default value, and usage string. 97// The return value is the address of an []byte variable that stores the value of the flag. 98func BytesHex(name string, value []byte, usage string) *[]byte { 99 return CommandLine.BytesHexP(name, "", value, usage) 100} 101 102// BytesHexP is like BytesHex, but accepts a shorthand letter that can be used after a single dash. 103func BytesHexP(name, shorthand string, value []byte, usage string) *[]byte { 104 return CommandLine.BytesHexP(name, shorthand, value, usage) 105} 106