drop setScalar

This commit is contained in:
Alex Flint 2018-04-18 21:23:08 -07:00
parent b1eda2c7b6
commit 6f2f3b4bf6
2 changed files with 18 additions and 10 deletions

View File

@ -159,7 +159,7 @@ func NewParser(config Config, dests ...interface{}) (*Parser, error) {
} }
// Check whether this field is supported. It's good to do this here rather than // Check whether this field is supported. It's good to do this here rather than
// wait until setScalar because it means that a program with invalid argument // wait until ParseValue because it means that a program with invalid argument
// fields will always fail regardless of whether the arguments it received // fields will always fail regardless of whether the arguments it received
// exercised those fields. // exercised those fields.
var parseable bool var parseable bool
@ -275,7 +275,7 @@ func process(specs []*spec, args []string) error {
} }
if spec.env != "" { if spec.env != "" {
if value, found := os.LookupEnv(spec.env); found { if value, found := os.LookupEnv(spec.env); found {
err := setScalar(spec.dest, value) err := scalar.ParseValue(spec.dest, value)
if err != nil { if err != nil {
return fmt.Errorf("error processing environment variable %s: %v", spec.env, err) return fmt.Errorf("error processing environment variable %s: %v", spec.env, err)
} }
@ -355,7 +355,7 @@ func process(specs []*spec, args []string) error {
i++ i++
} }
err := setScalar(spec.dest, value) err := scalar.ParseValue(spec.dest, value)
if err != nil { if err != nil {
return fmt.Errorf("error processing %s: %v", arg, err) return fmt.Errorf("error processing %s: %v", arg, err)
} }
@ -374,7 +374,7 @@ func process(specs []*spec, args []string) error {
} }
positionals = nil positionals = nil
} else if len(positionals) > 0 { } else if len(positionals) > 0 {
err := setScalar(spec.dest, positionals[0]) err := scalar.ParseValue(spec.dest, positionals[0])
if err != nil { if err != nil {
return fmt.Errorf("error processing %s: %v", spec.long, err) return fmt.Errorf("error processing %s: %v", spec.long, err)
} }
@ -438,7 +438,7 @@ func setSlice(dest reflect.Value, values []string, trunc bool) error {
for _, s := range values { for _, s := range values {
v := reflect.New(elem) v := reflect.New(elem)
if err := setScalar(v.Elem(), s); err != nil { if err := scalar.ParseValue(v.Elem(), s); err != nil {
return err return err
} }
if !ptr { if !ptr {
@ -500,8 +500,3 @@ func isScalar(t reflect.Type) (parseable, boolean bool) {
return parseable, false return parseable, false
} }
} }
// set a value from a string
func setScalar(v reflect.Value, s string) error {
return scalar.ParseValue(v, s)
}

View File

@ -599,6 +599,19 @@ func TestTextUnmarshaler(t *testing.T) {
assert.Equal(t, 3, args.Foo.val) assert.Equal(t, 3, args.Foo.val)
} }
func TestRepeatedTextUnmarshaler(t *testing.T) {
// fields that implement TextUnmarshaler should be parsed using that interface
var args struct {
Foo []*textUnmarshaler
}
err := parse("--foo abc d ef", &args)
require.NoError(t, err)
require.Len(t, args.Foo, 3)
assert.Equal(t, 3, args.Foo[0].val)
assert.Equal(t, 1, args.Foo[1].val)
assert.Equal(t, 2, args.Foo[2].val)
}
type boolUnmarshaler bool type boolUnmarshaler bool
func (p *boolUnmarshaler) UnmarshalText(b []byte) error { func (p *boolUnmarshaler) UnmarshalText(b []byte) error {