From 8f98961c46766e725269201fe42ad72fe1a79b8d Mon Sep 17 00:00:00 2001 From: Evan Fiordeliso Date: Fri, 10 Nov 2023 14:59:37 -0500 Subject: [PATCH] Add more flag types and add flag set --- command.go | 7 ++++++- flags/bool.go | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ flags/flag.go | 2 +- flags/float.go | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ flags/global.go | 11 ++++++++++ flags/int.go | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ flags/set.go | 29 +++++++++++++++++++++++++ flags/string.go | 9 ++++---- 8 files changed, 219 insertions(+), 7 deletions(-) create mode 100644 flags/bool.go create mode 100644 flags/float.go create mode 100644 flags/global.go create mode 100644 flags/int.go create mode 100644 flags/set.go diff --git a/command.go b/command.go index ca200a1..fab8e19 100644 --- a/command.go +++ b/command.go @@ -13,7 +13,7 @@ type Command struct { LongDescription string aliases []string arguments []*Argument - flags []flags.Flag + flags flags.Set subcommands []*Command parent *Command run func(args []string) @@ -59,6 +59,11 @@ func (c *Command) Execute(args []string) { args = args[1:] } + if err := c.flags.Parse(args); err != nil { + c.ShowHelp() + return + } + if len(args) > 0 { for _, subcommand := range c.subcommands { if subcommand.Name == args[0] { diff --git a/flags/bool.go b/flags/bool.go new file mode 100644 index 0000000..7b6ab3d --- /dev/null +++ b/flags/bool.go @@ -0,0 +1,56 @@ +package flags + +import "strconv" + +type BoolFlag struct { + name string + shortName string + description string + value bool +} + +var _ Flag = (*StringFlag)(nil) + +func NewBoolFlag(name, shortName string, defaultValue bool, description string) *BoolFlag { + return &BoolFlag{ + name: name, + shortName: shortName, + description: description, + value: defaultValue, + } +} + +// Description implements Flag. +func (f *BoolFlag) Description() string { + return f.description +} + +// Name implements Flag. +func (f *BoolFlag) Name() string { + return f.name +} + +// ShortName implements Flag. +func (f *BoolFlag) ShortName() string { + return f.shortName + +} + +// Value implements Flag. +func (f *BoolFlag) Parse(raw string) error { + if raw == "" { + return nil + } + + boolVal, err := strconv.ParseBool(raw) + if err != nil { + return err + } + + f.value = boolVal + return nil +} + +func (f *BoolFlag) Value() bool { + return f.value +} diff --git a/flags/flag.go b/flags/flag.go index 8eb843b..9e284c2 100644 --- a/flags/flag.go +++ b/flags/flag.go @@ -4,5 +4,5 @@ type Flag interface { Name() string ShortName() string Description() string - Parse(raw string) (any, error) + Parse(raw string) error } diff --git a/flags/float.go b/flags/float.go new file mode 100644 index 0000000..e4dff45 --- /dev/null +++ b/flags/float.go @@ -0,0 +1,56 @@ +package flags + +import "strconv" + +type FloatFlag struct { + name string + shortName string + description string + value float64 +} + +var _ Flag = (*FloatFlag)(nil) + +func NewFloatFlag(name, shortName string, defaultValue float64, description string) *FloatFlag { + return &FloatFlag{ + name: name, + shortName: shortName, + description: description, + value: defaultValue, + } +} + +// Description implements Flag. +func (f *FloatFlag) Description() string { + return f.description +} + +// Name implements Flag. +func (f *FloatFlag) Name() string { + return f.name +} + +// ShortName implements Flag. +func (f *FloatFlag) ShortName() string { + return f.shortName + +} + +// Value implements Flag. +func (f *FloatFlag) Parse(raw string) error { + if raw == "" { + return nil + } + + floatVal, err := strconv.ParseFloat(raw, 64) + if err != nil { + return err + } + + f.value = floatVal + return nil +} + +func (f *FloatFlag) Value() float64 { + return f.value +} diff --git a/flags/global.go b/flags/global.go new file mode 100644 index 0000000..8d45606 --- /dev/null +++ b/flags/global.go @@ -0,0 +1,11 @@ +package flags + +var globalFlags Set + +func Global(fs ...Flag) { + globalFlags = append(globalFlags, fs...) +} + +func Globals() Set { + return globalFlags +} diff --git a/flags/int.go b/flags/int.go new file mode 100644 index 0000000..97ba5bf --- /dev/null +++ b/flags/int.go @@ -0,0 +1,56 @@ +package flags + +import "strconv" + +type IntFlag struct { + name string + shortName string + description string + value int +} + +var _ Flag = (*StringFlag)(nil) + +func NewIntFlag(name, shortName string, defaultValue int, description string) *IntFlag { + return &IntFlag{ + name: name, + shortName: shortName, + description: description, + value: defaultValue, + } +} + +// Description implements Flag. +func (f *IntFlag) Description() string { + return f.description +} + +// Name implements Flag. +func (f *IntFlag) Name() string { + return f.name +} + +// ShortName implements Flag. +func (f *IntFlag) ShortName() string { + return f.shortName + +} + +// Value implements Flag. +func (f *IntFlag) Parse(raw string) error { + if raw == "" { + return nil + } + + intVal, err := strconv.Atoi(raw) + if err != nil { + return err + } + + f.value = intVal + return nil +} + +func (f *IntFlag) Value() int { + return f.value +} diff --git a/flags/set.go b/flags/set.go new file mode 100644 index 0000000..7ae7876 --- /dev/null +++ b/flags/set.go @@ -0,0 +1,29 @@ +package flags + +type Set []Flag + +func NewSet() Set { + return Set{} +} + +func (s Set) Add(f Flag) Set { + return append(s, f) +} + +func (s Set) Get(name string) (Flag, bool) { + for _, f := range s { + if f.Name() == name { + return f, true + } + + if f.ShortName() == name { + return f, true + } + } + return nil, false +} + +// TODO: Implement +func (s Set) Parse(args []string) error { + return nil +} diff --git a/flags/string.go b/flags/string.go index ebc14ea..a38c0c3 100644 --- a/flags/string.go +++ b/flags/string.go @@ -9,7 +9,7 @@ type StringFlag struct { var _ Flag = (*StringFlag)(nil) -func NewStringFlag(name, shortName, description, defaultValue string) *StringFlag { +func NewStringFlag(name, shortName, defaultValue, description string) *StringFlag { return &StringFlag{ name: name, shortName: shortName, @@ -35,14 +35,13 @@ func (f *StringFlag) ShortName() string { } // Value implements Flag. -func (f *StringFlag) Parse(raw string) (any, error) { +func (f *StringFlag) Parse(raw string) error { if raw == "" { - return f.value, nil + return nil } f.value = raw - - return raw, nil + return nil } func (f *StringFlag) Value() string {