package main import ( "context" "fmt" "os" "strconv" commandkit "gitea.maximumdirect.net/eric/CommandKit" ) type greetInput struct { Count commandkit.Supplied[int] Tags commandkit.Supplied[[]string] } func newApp() (*commandkit.App, error) { countDefault := 1 tagDefaults := []string{"demo"} greet := commandkit.NewCommand(commandkit.CommandSpec[greetInput]{ Name: "greet", Summary: "Show presence-aware values and repeated labels.", Flags: []commandkit.Flag[greetInput]{ commandkit.ValueFlag(commandkit.FlagMeta{Name: "count", Usage: "Greeting count."}, &countDefault, strconv.Atoi, func(input *greetInput, value commandkit.Supplied[int]) { input.Count = value }), commandkit.RepeatFlag(commandkit.FlagMeta{Name: "tag", Usage: "A repeatable label."}, tagDefaults, func(value string) (string, error) { return value, nil }, func(input *greetInput, value commandkit.Supplied[[]string]) { input.Tags = value }), }, Run: func(invocation commandkit.Invocation, input greetInput) commandkit.Outcome { count := fmt.Sprintf("default %d (not supplied)", input.Count.Value) if input.Count.Set { count = fmt.Sprintf("explicit %d", input.Count.Value) } tags := fmt.Sprintf("default %v (not supplied)", input.Tags.Value) if input.Tags.Set { tags = fmt.Sprintf("explicit %v", input.Tags.Value) } if _, err := fmt.Fprintf(invocation.Streams.Out, "Hello; count=%s; tags=%s; entered=%q; canonical=%q\n", count, tags, invocation.EnteredPath(), invocation.CanonicalPath()); err != nil { return commandkit.Failure(err) } return commandkit.Success() }, }) workspace := commandkit.Group("workspace", "Workspace commands.", greet) declarations := []commandkit.Declaration{ workspace, commandkit.Alias("hello", "workspace greet"), commandkit.Alias("ws", "workspace"), commandkit.FlagAliasFor("workspace greet", "--times", "--count"), commandkit.FlagAlias("--hlep", "--help"), } return commandkit.New(commandkit.Identity{Name: "core-example", Version: "1.0"}, declarations...) } func main() { app, err := newApp() if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } outcome := app.Execute(context.Background(), os.Args[1:], commandkit.Streams{Out: os.Stdout, Err: os.Stderr}) if outcome.Status != 0 { os.Exit(outcome.Status) } }