From dfa3217037d8c24181be24484892ecb950a2a5ba Mon Sep 17 00:00:00 2001 From: Ophestra Date: Sat, 22 Feb 2025 23:11:17 +0900 Subject: command: implement builder and parser Signed-off-by: Ophestra --- command/flag.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 command/flag.go (limited to 'command/flag.go') 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) + " ]") +} + +// 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 + } +} -- cgit v1.3.1