miller/pkg/cli/verb_utils.go
Adam Lesperance 085e831668
The package version must match the major tag version (#1654)
* Update package version

* Update makefile targets

* Update readme packages

* Remaining old packages via rg/sd
2024-09-20 12:10:11 -04:00

72 lines
2.5 KiB
Go

// ================================================================
// Utilities for Miller verbs to share for command-line parsing.
// ================================================================
package cli
import (
"fmt"
"os"
"strconv"
"github.com/johnkerl/miller/v6/pkg/lib"
)
// For flags with values, e.g. ["-n" "10"], while we're looking at the "-n" this let us see if the "10" slot exists.
// The verb is nominally something from a ways earlier in args[]; the opt is nominally what's at args[argi-1].
// So this function should be called with args[argi] pointing to the "10" slot.
func VerbCheckArgCount(verb string, opt string, args []string, argi int, argc int, n int) {
if (argc - argi) < n {
fmt.Fprintf(os.Stderr, "%s %s: option \"%s\" missing argument(s).\n",
"mlr", verb, opt,
)
os.Exit(1)
}
}
// E.g. with ["-f", "a,b,c"], makes sure there is something in the "a,b,c" position, and returns it.
func VerbGetStringArgOrDie(verb string, opt string, args []string, pargi *int, argc int) string {
VerbCheckArgCount(verb, opt, args, *pargi, argc, 1)
retval := args[*pargi]
*pargi += 1
return retval
}
// E.g. with ["-f", "a,b,c"], makes sure there is something in the "a,b,c" position,
// splits it on commas, and returns it.
func VerbGetStringArrayArgOrDie(verb string, opt string, args []string, pargi *int, argc int) []string {
stringArg := VerbGetStringArgOrDie(verb, opt, args, pargi, argc)
return lib.SplitString(stringArg, ",")
}
// E.g. with ["-n", "10"], makes sure there is something in the "10" position,
// scans it as int, and returns it.
func VerbGetIntArgOrDie(verb string, opt string, args []string, pargi *int, argc int) int64 {
flag := args[*pargi]
stringArg := VerbGetStringArgOrDie(verb, opt, args, pargi, argc)
retval, err := strconv.ParseInt(stringArg, 10, 64)
if err != nil {
fmt.Fprintf(os.Stderr,
"%s %s: could not scan flag \"%s\" argument \"%s\" as int.\n",
"mlr", verb, flag, stringArg,
)
os.Exit(1)
}
return retval
}
// E.g. with ["-n", "10.3"], makes sure there is something in the "10.3"
// position, scans it as float, and returns it.
func VerbGetFloatArgOrDie(verb string, opt string, args []string, pargi *int, argc int) float64 {
flag := args[*pargi]
stringArg := VerbGetStringArgOrDie(verb, opt, args, pargi, argc)
retval, err := strconv.ParseFloat(stringArg, 64)
if err != nil {
fmt.Fprintf(os.Stderr,
"%s %s: could not scan flag \"%s\" argument \"%s\" as float.\n",
"mlr", verb, flag, stringArg,
)
os.Exit(1)
}
return retval
}