diff --git a/args.go b/args.go index 16f1069..830c84b 100644 --- a/args.go +++ b/args.go @@ -89,6 +89,8 @@ func (a *Args) AttributesMap() map[string]string { m[key] = v[0] } else if len(v) > 0 { m[key] = strings.Join(v, ",") + } else if flag.Required { + panic(fmt.Errorf("flag %s is required", k)) } } return m @@ -204,28 +206,29 @@ func (a *Args) Parse(args []string) error { return nil } -func (a *Args) TypeOf(key string) (out string, e error) { - flags := a.lookup(key) +func (a *Args) UniqueFlagForFlagPrefix(flagPrefix string) (flag *Flag, e error) { + flags := a.lookup(flagPrefix) switch len(flags) { case 0: - e = fmt.Errorf("no mapping defined for %s", key) + e = fmt.Errorf("no mapping defined for %s", flagPrefix) case 1: - out = flags[0].Type + flag = flags[0] default: - e = fmt.Errorf("mapping for %s not uniq", key) + e = fmt.Errorf("mapping for %s not uniq", flagPrefix) } - return out, e + return flag, e } func (a *Args) handleArgFlag(flag string) error { - if t, e := a.TypeOf(flag); e != nil { + if flag, e := a.UniqueFlagForFlagPrefix(flag); e != nil { return e } else { + t := flag.Type switch t { case STRING, INTEGER: - a.currentKey = flag + a.currentKey = flag.CliFlag case BOOL: - a.AddAttribute(flag, "true") + a.AddAttribute(flag.CliFlag, "true") default: return fmt.Errorf("no mapping defined for %s", flag) } @@ -237,9 +240,13 @@ func (a *Args) handleArg(arg string) error { if parts := re.FindStringSubmatch(arg); len(parts) == 2 { chunks := strings.Split(parts[1], "=") if len(chunks) == 2 { - key, value := chunks[0], chunks[1] - a.AddAttribute(key, value) - return nil + if flag, e := a.UniqueFlagForFlagPrefix(chunks[0]); e != nil { + return e + } else { + key, value := flag.CliFlag, chunks[1] + a.AddAttribute(key, value) + return nil + } } else { if e := a.handleArgFlag(chunks[0]); e != nil { return e diff --git a/args_test.go b/args_test.go index 01d16f2..1a896f2 100644 --- a/args_test.go +++ b/args_test.go @@ -48,7 +48,8 @@ func TestRegister(t *testing.T) { }, ) assert.NotNil(t, args) - ty, _ := args.TypeOf("-h") + flag, _ := args.UniqueFlagForFlagPrefix("-h") + ty := flag.Type assert.Equal(t, ty, "string") } @@ -126,7 +127,8 @@ func TestAttributesMapWithMultipleArgs(t *testing.T) { func TestRegisterBool(t *testing.T) { args := &Args{} args.RegisterBool("--disabled", "disabled", false, false, "Disabled") - tp, _ := args.TypeOf("--disabled") + flag, _ := args.UniqueFlagForFlagPrefix("--disabled") + tp := flag.Type assert.Equal(t, tp, "bool") e := args.Parse([]string{"--disabled"}) assert.Nil(t, e) @@ -138,3 +140,12 @@ func TestRegisterArgs(t *testing.T) { args := &Args{} args.RegisterArgs("command host") } + +func TestGetWithFuzzyMatching(t *testing.T) { + args := NewArgs(FlagMap{ + "--version": {Type: STRING, DefaultValue: "1.2.3"}, + }) + args.Parse([]string{"--ver", "1.2.1"}) + value := args.Get("--version") + assert.Equal(t, []string{"1.2.1"}, value) +}