aboutsummaryrefslogtreecommitdiffhomepage
path: root/command
diff options
context:
space:
mode:
Diffstat (limited to 'command')
-rw-r--r--command/command.go5
-rw-r--r--command/parse.go25
2 files changed, 30 insertions, 0 deletions
diff --git a/command/command.go b/command/command.go
index eeec135d..5533c4ef 100644
--- a/command/command.go
+++ b/command/command.go
@@ -29,6 +29,11 @@ type (
Command interface {
Parse(arguments []string) error
+
+ // MustParse determines exit outcomes for Parse errors
+ // and calls handleError if [HandlerFunc] returns a non-nil error.
+ MustParse(arguments []string, handleError func(error))
+
baseNode[Command]
}
Node baseNode[Node]
diff --git a/command/parse.go b/command/parse.go
index 02120464..8e21433c 100644
--- a/command/parse.go
+++ b/command/parse.go
@@ -3,6 +3,7 @@ package command
import (
"errors"
"log"
+ "os"
)
var (
@@ -78,3 +79,27 @@ func (n *node) printf(format string, a ...any) {
n.logf(format, a...)
}
}
+
+func (n *node) MustParse(arguments []string, handleError func(error)) {
+ switch err := n.Parse(arguments); err {
+ case nil:
+ return
+ case ErrHelp:
+ os.Exit(0)
+ case ErrNoMatch:
+ os.Exit(1)
+ case ErrEmptyTree:
+ os.Exit(1)
+ default:
+ var flagError FlagError
+ if !errors.As(err, &flagError) { // returned by HandlerFunc
+ handleError(err)
+ os.Exit(1)
+ }
+
+ if flagError.Success() {
+ os.Exit(0)
+ }
+ os.Exit(1)
+ }
+}