Add more flag types and add flag set
This commit is contained in:
parent
5519d58908
commit
8f98961c46
|
@ -13,7 +13,7 @@ type Command struct {
|
||||||
LongDescription string
|
LongDescription string
|
||||||
aliases []string
|
aliases []string
|
||||||
arguments []*Argument
|
arguments []*Argument
|
||||||
flags []flags.Flag
|
flags flags.Set
|
||||||
subcommands []*Command
|
subcommands []*Command
|
||||||
parent *Command
|
parent *Command
|
||||||
run func(args []string)
|
run func(args []string)
|
||||||
|
@ -59,6 +59,11 @@ func (c *Command) Execute(args []string) {
|
||||||
args = args[1:]
|
args = args[1:]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := c.flags.Parse(args); err != nil {
|
||||||
|
c.ShowHelp()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if len(args) > 0 {
|
if len(args) > 0 {
|
||||||
for _, subcommand := range c.subcommands {
|
for _, subcommand := range c.subcommands {
|
||||||
if subcommand.Name == args[0] {
|
if subcommand.Name == args[0] {
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
|
@ -4,5 +4,5 @@ type Flag interface {
|
||||||
Name() string
|
Name() string
|
||||||
ShortName() string
|
ShortName() string
|
||||||
Description() string
|
Description() string
|
||||||
Parse(raw string) (any, error)
|
Parse(raw string) error
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
package flags
|
||||||
|
|
||||||
|
var globalFlags Set
|
||||||
|
|
||||||
|
func Global(fs ...Flag) {
|
||||||
|
globalFlags = append(globalFlags, fs...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Globals() Set {
|
||||||
|
return globalFlags
|
||||||
|
}
|
|
@ -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
|
||||||
|
}
|
|
@ -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
|
||||||
|
}
|
|
@ -9,7 +9,7 @@ type StringFlag struct {
|
||||||
|
|
||||||
var _ Flag = (*StringFlag)(nil)
|
var _ Flag = (*StringFlag)(nil)
|
||||||
|
|
||||||
func NewStringFlag(name, shortName, description, defaultValue string) *StringFlag {
|
func NewStringFlag(name, shortName, defaultValue, description string) *StringFlag {
|
||||||
return &StringFlag{
|
return &StringFlag{
|
||||||
name: name,
|
name: name,
|
||||||
shortName: shortName,
|
shortName: shortName,
|
||||||
|
@ -35,14 +35,13 @@ func (f *StringFlag) ShortName() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Value implements Flag.
|
// Value implements Flag.
|
||||||
func (f *StringFlag) Parse(raw string) (any, error) {
|
func (f *StringFlag) Parse(raw string) error {
|
||||||
if raw == "" {
|
if raw == "" {
|
||||||
return f.value, nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
f.value = raw
|
f.value = raw
|
||||||
|
return nil
|
||||||
return raw, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *StringFlag) Value() string {
|
func (f *StringFlag) Value() string {
|
||||||
|
|
Loading…
Reference in New Issue