diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-02-23 12:55:10 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-02-23 12:55:10 +0900 |
| commit | ba1498cd181bf47a2b154aca1bcade804b790b69 (patch) | |
| tree | 3f07bf96ae63e01c8fb941bc88d850e549f92421 /command | |
| parent | eda4d612c2e64321766e1074a698caeae843102a (diff) | |
command: filter parse errors
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'command')
| -rw-r--r-- | command/command.go | 5 | ||||
| -rw-r--r-- | command/parse.go | 25 |
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) + } +} |
