Ensure -- consumes all tokens, not just positional.
This commit is contained in:
@@ -159,7 +159,8 @@ func (r *Registry) RegisterDefaults() *Registry {
|
|||||||
RegisterKind(reflect.Float32, floatDecoder(32)).
|
RegisterKind(reflect.Float32, floatDecoder(32)).
|
||||||
RegisterKind(reflect.Float64, floatDecoder(64)).
|
RegisterKind(reflect.Float64, floatDecoder(64)).
|
||||||
RegisterKind(reflect.String, MapperFunc(func(ctx *DecodeContext, target reflect.Value) error {
|
RegisterKind(reflect.String, MapperFunc(func(ctx *DecodeContext, target reflect.Value) error {
|
||||||
target.SetString(ctx.Scan.PopValue("string"))
|
token := ctx.Scan.PopValue("string")
|
||||||
|
target.SetString(token)
|
||||||
return nil
|
return nil
|
||||||
})).
|
})).
|
||||||
RegisterKind(reflect.Bool, boolMapper{}).
|
RegisterKind(reflect.Bool, boolMapper{}).
|
||||||
@@ -294,7 +295,7 @@ func sliceDecoder(r *Registry) MapperFunc {
|
|||||||
childScanner = Scan(SplitEscaped(ctx.Scan.PopValue("list"), sep)...)
|
childScanner = Scan(SplitEscaped(ctx.Scan.PopValue("list"), sep)...)
|
||||||
} else {
|
} else {
|
||||||
tokens := ctx.Scan.PopWhile(func(t Token) bool { return t.IsValue() })
|
tokens := ctx.Scan.PopWhile(func(t Token) bool { return t.IsValue() })
|
||||||
childScanner = Scan(tokens...)
|
childScanner = ScanFromTokens(tokens...)
|
||||||
}
|
}
|
||||||
childDecoder := r.ForNamedType(ctx.Value.Tag.Type, el)
|
childDecoder := r.ForNamedType(ctx.Value.Tag.Type, el)
|
||||||
if childDecoder == nil {
|
if childDecoder == nil {
|
||||||
|
|||||||
@@ -110,3 +110,13 @@ func TestURLMapper(t *testing.T) {
|
|||||||
_, err = p.Parse([]string{":foo"})
|
_, err = p.Parse([]string{":foo"})
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSliceConsumesRemainingPositionalArgs(t *testing.T) {
|
||||||
|
var cli struct {
|
||||||
|
Remainder []string `arg:""`
|
||||||
|
}
|
||||||
|
p := mustNew(t, &cli)
|
||||||
|
_, err := p.Parse([]string{"--", "ls", "-lart"})
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, []string{"ls", "-lart"}, cli.Remainder)
|
||||||
|
}
|
||||||
|
|||||||
+9
-4
@@ -87,6 +87,11 @@ func Scan(args ...string) *Scanner {
|
|||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ScanFromTokens creates a new Scanner from a slice of tokens.
|
||||||
|
func ScanFromTokens(tokens ...Token) *Scanner {
|
||||||
|
return &Scanner{args: tokens}
|
||||||
|
}
|
||||||
|
|
||||||
// Len returns the number of input arguments.
|
// Len returns the number of input arguments.
|
||||||
func (s *Scanner) Len() int {
|
func (s *Scanner) Len() int {
|
||||||
return len(s.args)
|
return len(s.args)
|
||||||
@@ -114,17 +119,17 @@ func (s *Scanner) PopValue(context string) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// PopWhile predicate returns true.
|
// PopWhile predicate returns true.
|
||||||
func (s *Scanner) PopWhile(predicate func(Token) bool) (values []string) {
|
func (s *Scanner) PopWhile(predicate func(Token) bool) (values []Token) {
|
||||||
for predicate(s.Peek()) {
|
for predicate(s.Peek()) {
|
||||||
values = append(values, s.Pop().Value)
|
values = append(values, s.Pop())
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// PopUntil predicate returns true.
|
// PopUntil predicate returns true.
|
||||||
func (s *Scanner) PopUntil(predicate func(Token) bool) (values []string) {
|
func (s *Scanner) PopUntil(predicate func(Token) bool) (values []Token) {
|
||||||
for !predicate(s.Peek()) {
|
for !predicate(s.Peek()) {
|
||||||
values = append(values, s.Pop().Value)
|
values = append(values, s.Pop())
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user