From 5d3efcc64fc9664e061b44659f85aeec03a56685 Mon Sep 17 00:00:00 2001 From: DJ O'Leary Date: Sun, 6 Sep 2026 23:53:43 +0200 Subject: feat(cli): add cli flags to call api --- src/cli/subcommand_group.go | 56 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/cli/subcommand_group.go (limited to 'src/cli/subcommand_group.go') diff --git a/src/cli/subcommand_group.go b/src/cli/subcommand_group.go new file mode 100644 index 0000000..957e759 --- /dev/null +++ b/src/cli/subcommand_group.go @@ -0,0 +1,56 @@ +package cli + +import ( + "errors" + "flag" + "fmt" + "io" + "strings" +) + +var ErrUnknownCommand = errors.New("error: unknown command") + +type SubcommandFunc = func(*flag.FlagSet) error + +type Subcommand struct { + FlagSet *flag.FlagSet + Usage string + Func SubcommandFunc +} + +type SubcommandGroup struct { + subcommands map[string]Subcommand + output io.Writer + errorHandling flag.ErrorHandling +} + +func NewSubcommandGroup(output io.Writer, errorHandling flag.ErrorHandling) SubcommandGroup { + return SubcommandGroup{subcommands: make(map[string]Subcommand), output: output, errorHandling: errorHandling} +} + +func (sg *SubcommandGroup) AddSubcommand(name string, usage string, fn SubcommandFunc) { + fs := flag.NewFlagSet(name, sg.errorHandling) + fs.SetOutput(sg.output) + sg.subcommands[name] = Subcommand{ + FlagSet: fs, + Usage: usage, + Func: fn, + } +} + +func (sg SubcommandGroup) ExecSubcommand(name string) error { + cmd, ok := sg.subcommands[name] + if !ok { + return ErrUnknownCommand + } + return cmd.Func(cmd.FlagSet) +} + +func (sg SubcommandGroup) Usage() string { + var b strings.Builder + b.WriteString(" subcommands:\n") + for _, cmd := range sg.subcommands { + fmt.Fprintf(&b, " %s: %s\n", cmd.FlagSet.Name(), cmd.Usage) + } + return b.String() +} -- cgit v1.2.3