diff --git a/command/builder.go b/command/builder.go index ae49c56..5c9b4de 100644 --- a/command/builder.go +++ b/command/builder.go @@ -31,6 +31,11 @@ func newNode(output io.Writer, logf LogFunc, name, usage string) *node { } func (n *node) Command(name, usage string, f HandlerFunc) Node { + n.NewCommand(name, usage, f) + return n +} + +func (n *node) NewCommand(name, usage string, f HandlerFunc) Flag[Node] { if f == nil { panic("invalid handler") } @@ -43,7 +48,7 @@ func (n *node) Command(name, usage string, f HandlerFunc) Node { if !n.adopt(s) { panic("attempted to initialise subcommand with non-unique name") } - return n + return s } func (n *node) New(name, usage string) Node { diff --git a/command/command.go b/command/command.go index 55f0ead..d0cab36 100644 --- a/command/command.go +++ b/command/command.go @@ -19,6 +19,11 @@ type ( Define(b *strings.Builder, set *flag.FlagSet, p any, name, usage string) } + Flag[T any] interface { + // Flag defines a generic flag type in Node's flag set. + Flag(p any, name string, value FlagDefiner, usage string) T + } + Command interface { Parse(arguments []string) error baseNode[Command] @@ -28,10 +33,12 @@ type ( baseNode[T any] interface { // Command appends a subcommand with direct command handling. Command(name, usage string, f HandlerFunc) T - // Flag defines a generic flag type in Node's flag set. - Flag(p any, name string, value FlagDefiner, usage string) T // New returns a new subcommand tree. New(name, usage string) (sub Node) + // NewCommand returns a new subcommand with direct command handling. + NewCommand(name, usage string, f HandlerFunc) (sub Flag[Node]) + + Flag[T] } )