diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-02-22 23:11:17 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-02-22 23:11:17 +0900 |
| commit | dfa3217037d8c24181be24484892ecb950a2a5ba (patch) | |
| tree | e2022ad6ce2e11bbb7b4d0b38731a6c67561235f /command/flag.go | |
| parent | 8000a2febb546b3b68eddd9330d5709281068e9f (diff) | |
command: implement builder and parser
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'command/flag.go')
| -rw-r--r-- | command/flag.go | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/command/flag.go b/command/flag.go new file mode 100644 index 00000000..5765dd0d --- /dev/null +++ b/command/flag.go @@ -0,0 +1,49 @@ +package command + +import ( + "errors" + "flag" + "strings" +) + +// FlagError wraps errors returned by [flag]. +type FlagError struct{ error } + +func (e FlagError) Success() bool { return errors.Is(e.error, flag.ErrHelp) } +func (e FlagError) Is(target error) bool { + return (e.error == nil && target == nil) || + ((e.error != nil && target != nil) && e.error.Error() == target.Error()) +} + +func (n *node) Flag(p any, name string, value FlagDefiner, usage string) Node { + value.Define(&n.suffix, n.set, p, name, usage) + return n +} + +// StringFlag is the default value of a string flag. +type StringFlag string + +func (v StringFlag) Define(b *strings.Builder, set *flag.FlagSet, p any, name, usage string) { + set.StringVar(p.(*string), name, string(v), usage) + b.WriteString(" [" + prettyFlag(name) + " <value>]") +} + +// BoolFlag is the default value of a bool flag. +type BoolFlag bool + +func (v BoolFlag) Define(b *strings.Builder, set *flag.FlagSet, p any, name, usage string) { + set.BoolVar(p.(*bool), name, bool(v), usage) + b.WriteString(" [" + prettyFlag(name) + "]") +} + +// this has no effect on parse outcome +func prettyFlag(name string) string { + switch len(name) { + case 0: + panic("zero length flag name") + case 1: + return "-" + name + default: + return "--" + name + } +} |
