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
 | |
| }
 |