From ba1498cd181bf47a2b154aca1bcade804b790b69 Mon Sep 17 00:00:00 2001 From: Ophestra Date: Sun, 23 Feb 2025 12:55:10 +0900 Subject: [PATCH] command: filter parse errors Signed-off-by: Ophestra --- command/command.go | 5 +++++ command/parse.go | 25 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/command/command.go b/command/command.go index eeec135..5533c4e 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 0212046..8e21433 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) + } +}