kittens: Fix errors not being reported to user when run a UI kitten

Fixes #6403
This commit is contained in:
Kovid Goyal 2023-06-29 07:36:24 +05:30
parent e81a40255b
commit ab10070ee8
No known key found for this signature in database
GPG key ID: 06BC317B515ACE7C
3 changed files with 25 additions and 3 deletions

View file

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

View file

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

View file

@ -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)