Better flags help lines

This commit is contained in:
Evan Fiordeliso 2023-11-10 15:11:50 -05:00
parent 8f98961c46
commit 46a6f8d48e
9 changed files with 55 additions and 10 deletions

View File

@ -5,8 +5,14 @@ import (
"os"
"go.fifitido.net/cmd"
"go.fifitido.net/cmd/flags"
)
var stringFlag = flags.String("string", "s", "", "example string flag")
var intFlag = flags.Int("int", "i", 0, "example int flag")
var boolFlag = flags.Bool("bool", "b", false, "example bool flag")
var floatFlag = flags.Float("float", "f", 0, "example float flag")
var root = cmd.NewRoot(
cmd.WithShortDescription("Example command"),
cmd.WithLongDescription(`An example command to show how to use go.fifitido.net/cmd
@ -15,6 +21,7 @@ this example is just a simple hello world program to show
the basics of the library.`),
cmd.WithSubcommand(subcmd),
cmd.WithArgument("name", false),
cmd.WithFlags(stringFlag, intFlag, boolFlag, floatFlag),
cmd.WithRunFunc(func(args []string) {
if len(args) == 0 {
fmt.Println("Hello World!")

View File

@ -11,7 +11,7 @@ type BoolFlag struct {
var _ Flag = (*StringFlag)(nil)
func NewBoolFlag(name, shortName string, defaultValue bool, description string) *BoolFlag {
func Bool(name, shortName string, defaultValue bool, description string) *BoolFlag {
return &BoolFlag{
name: name,
shortName: shortName,

View File

@ -1,8 +1,34 @@
package flags
import "fmt"
type Flag interface {
Name() string
ShortName() string
Description() string
Parse(raw string) error
}
func Names(f Flag) string {
names := ""
if f.ShortName() != "" {
names += fmt.Sprintf("-%s, ", f.ShortName())
}
names += fmt.Sprintf("--%s", f.Name())
return names
}
func HelpLine(f Flag, paddedWidth int) string {
argNames := ""
if f.ShortName() != "" {
argNames += fmt.Sprintf("-%s, ", f.ShortName())
}
argNames += fmt.Sprintf("--%s", f.Name())
spaceSize := paddedWidth - len(argNames)
if spaceSize > 0 {
argNames += fmt.Sprintf("%*s", spaceSize, "")
}
return argNames + " " + f.Description()
}

View File

@ -11,7 +11,7 @@ type FloatFlag struct {
var _ Flag = (*FloatFlag)(nil)
func NewFloatFlag(name, shortName string, defaultValue float64, description string) *FloatFlag {
func Float(name, shortName string, defaultValue float64, description string) *FloatFlag {
return &FloatFlag{
name: name,
shortName: shortName,

View File

@ -11,7 +11,7 @@ type IntFlag struct {
var _ Flag = (*StringFlag)(nil)
func NewIntFlag(name, shortName string, defaultValue int, description string) *IntFlag {
func Int(name, shortName string, defaultValue int, description string) *IntFlag {
return &IntFlag{
name: name,
shortName: shortName,

View File

@ -23,6 +23,16 @@ func (s Set) Get(name string) (Flag, bool) {
return nil, false
}
func (s Set) MaxWidth() int {
max := 0
for _, f := range s {
if w := len(Names(f)); w > max {
max = w
}
}
return max
}
// TODO: Implement
func (s Set) Parse(args []string) error {
return nil

View File

@ -9,7 +9,7 @@ type StringFlag struct {
var _ Flag = (*StringFlag)(nil)
func NewStringFlag(name, shortName, defaultValue, description string) *StringFlag {
func String(name, shortName, defaultValue, description string) *StringFlag {
return &StringFlag{
name: name,
shortName: shortName,
@ -31,7 +31,6 @@ func (f *StringFlag) Name() string {
// ShortName implements Flag.
func (f *StringFlag) ShortName() string {
return f.shortName
}
// Value implements Flag.

View File

@ -2,6 +2,8 @@ package cmd
import (
"fmt"
"go.fifitido.net/cmd/flags"
)
func (c *Command) ShowHelp() {
@ -39,8 +41,9 @@ func (c *Command) ShowHelp() {
fmt.Println()
fmt.Println("Available flags:")
for _, s := range c.flags {
fmt.Println(" " + s.Name() + " " + s.Description())
paddedWidth := c.flags.MaxWidth()
for _, f := range c.flags {
fmt.Println(" " + flags.HelpLine(f, paddedWidth))
}
fmt.Println(" -h, --help Show the help menu")

View File

@ -22,7 +22,7 @@ func WithArgument(name string, required bool) Option {
}
}
func WithArguments(args []*Argument) Option {
func WithArguments(args ...*Argument) Option {
return func(c *Command) {
c.arguments = append(c.arguments, args...)
}
@ -34,7 +34,7 @@ func WithFlag(f flags.Flag) Option {
}
}
func WithFlags(fs []flags.Flag) Option {
func WithFlags(fs ...flags.Flag) Option {
return func(c *Command) {
c.flags = append(c.flags, fs...)
}
@ -47,7 +47,7 @@ func WithSubcommand(s *Command) Option {
}
}
func WithSubcommands(ss []*Command) Option {
func WithSubcommands(ss ...*Command) Option {
return func(c *Command) {
c.subcommands = append(c.subcommands, ss...)
}