diff --git a/tools/cli/command.go b/tools/cli/command.go index b0d243db1..585516ce9 100644 --- a/tools/cli/command.go +++ b/tools/cli/command.go @@ -39,6 +39,8 @@ type Command struct { IgnoreAllArgs bool // Specialised arg parsing ParseArgsForCompletion func(cmd *Command, args []string, completions *Completions) + // Callback that is called on error + CallbackOnError func(cmd *Command, err error, during_parsing bool, exit_code int) (final_exit_code int) SubCommandGroups []*CommandGroup OptionGroups []*OptionGroup @@ -529,6 +531,9 @@ func (self *Command) ExecArgs(args []string) (exit_code int) { } cmd, err := root.ParseArgs(args) if err != nil { + if self.CallbackOnError != nil { + return self.CallbackOnError(cmd, err, true, 1) + } ShowError(err) return 1 } @@ -543,10 +548,13 @@ func (self *Command) ExecArgs(args []string) (exit_code int) { } else if cmd.Run != nil { exit_code, err = cmd.Run(cmd, cmd.Args) if err != nil { - ShowError(err) if exit_code == 0 { exit_code = 1 } + if self.CallbackOnError != nil { + return self.CallbackOnError(cmd, err, false, exit_code) + } + ShowError(err) } } return diff --git a/tools/cmd/tool/main.go b/tools/cmd/tool/main.go index 7e8f191c8..c72fdbcba 100644 --- a/tools/cmd/tool/main.go +++ b/tools/cmd/tool/main.go @@ -30,6 +30,7 @@ var _ = fmt.Print func KittyToolEntryPoints(root *cli.Command) { root.Add(cli.OptionSpec{ Name: "--version", Type: "bool-set", Help: "The current kitten version."}) + tui.PrepareRootCmd(root) // @ at.EntryPoint(root) // update-self diff --git a/tools/tui/ui_kitten.go b/tools/tui/ui_kitten.go index 02668107b..2029c3a77 100644 --- a/tools/tui/ui_kitten.go +++ b/tools/tui/ui_kitten.go @@ -15,9 +15,22 @@ import ( var _ = fmt.Print +var RunningAsUI = utils.Once(func() bool { + defer func() { os.Unsetenv("KITTEN_RUNNING_AS_UI") }() + return os.Getenv("KITTEN_RUNNING_AS_UI") != "" +}) + +func PrepareRootCmd(root *cli.Command) { + if RunningAsUI() { + root.CallbackOnError = func(cmd *cli.Command, err error, during_parsing bool, exit_code int) int { + ReportError(err) + return exit_code + } + } +} + func KittenOutputSerializer() func(any) (string, error) { - write_with_escape_code := os.Getenv("KITTEN_RUNNING_AS_UI") != "" - os.Unsetenv("KITTEN_RUNNING_AS_UI") + write_with_escape_code := RunningAsUI() if write_with_escape_code { return func(what any) (string, error) { data, err := json.Marshal(what)