This allows for early initialisation with access to flags on the root node. This can be useful for configuring global state used by subcommands. Signed-off-by: Ophestra <cat@gensokyo.uk>
66 lines
1.3 KiB
Go
66 lines
1.3 KiB
Go
package command
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"io"
|
|
)
|
|
|
|
// New initialises a root Node.
|
|
func New(output io.Writer, logf LogFunc, name string, early HandlerFunc) Command {
|
|
c := rootNode{newNode(output, logf, name, "")}
|
|
c.f = early
|
|
return c
|
|
}
|
|
|
|
func newNode(output io.Writer, logf LogFunc, name, usage string) *node {
|
|
n := &node{
|
|
name: name, usage: usage,
|
|
out: output, logf: logf,
|
|
set: flag.NewFlagSet(name, flag.ContinueOnError),
|
|
}
|
|
n.set.SetOutput(output)
|
|
n.set.Usage = func() {
|
|
_ = n.writeHelp()
|
|
if n.suffix.Len() > 0 {
|
|
_, _ = fmt.Fprintln(output, "Flags:")
|
|
n.set.PrintDefaults()
|
|
_, _ = fmt.Fprintln(output)
|
|
}
|
|
}
|
|
|
|
return n
|
|
}
|
|
|
|
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")
|
|
}
|
|
if name == "" || usage == "" {
|
|
panic("invalid subcommand")
|
|
}
|
|
|
|
s := newNode(n.out, n.logf, name, usage)
|
|
s.f = f
|
|
if !n.adopt(s) {
|
|
panic("attempted to initialise subcommand with non-unique name")
|
|
}
|
|
return s
|
|
}
|
|
|
|
func (n *node) New(name, usage string) Node {
|
|
if name == "" || usage == "" {
|
|
panic("invalid subcommand tree")
|
|
}
|
|
s := newNode(n.out, n.logf, name, usage)
|
|
if !n.adopt(s) {
|
|
panic("attempted to initialise subcommand tree with non-unique name")
|
|
}
|
|
return s
|
|
}
|