94 lines
1.9 KiB
Go
94 lines
1.9 KiB
Go
// Package appargs provides argument validation routines for use with
|
|
// github.com/urfave/cli.
|
|
package appargs
|
|
|
|
import (
|
|
"errors"
|
|
"strconv"
|
|
|
|
"github.com/urfave/cli"
|
|
)
|
|
|
|
// Validator is an argument validator function. It returns the number of
|
|
// arguments consumed or -1 on error.
|
|
type Validator = func([]string) int
|
|
|
|
// String is a validator for strings.
|
|
func String(args []string) int {
|
|
if len(args) == 0 {
|
|
return -1
|
|
}
|
|
return 1
|
|
}
|
|
|
|
// NonEmptyString is a validator for non-empty strings.
|
|
func NonEmptyString(args []string) int {
|
|
if len(args) == 0 || args[0] == "" {
|
|
return -1
|
|
}
|
|
return 1
|
|
}
|
|
|
|
// Int returns a validator for integers.
|
|
func Int(base int, min int, max int) Validator {
|
|
return func(args []string) int {
|
|
if len(args) == 0 {
|
|
return -1
|
|
}
|
|
i, err := strconv.ParseInt(args[0], base, 0)
|
|
if err != nil || int(i) < min || int(i) > max {
|
|
return -1
|
|
}
|
|
return 1
|
|
}
|
|
}
|
|
|
|
// Optional returns a validator that treats an argument as optional.
|
|
func Optional(v Validator) Validator {
|
|
return func(args []string) int {
|
|
if len(args) == 0 {
|
|
return 0
|
|
}
|
|
return v(args)
|
|
}
|
|
}
|
|
|
|
// Rest returns a validator that validates each of the remaining arguments.
|
|
func Rest(v Validator) Validator {
|
|
return func(args []string) int {
|
|
count := len(args)
|
|
for len(args) != 0 {
|
|
n := v(args)
|
|
if n < 0 {
|
|
return n
|
|
}
|
|
args = args[n:]
|
|
}
|
|
return count
|
|
}
|
|
}
|
|
|
|
// ErrInvalidUsage is returned when there is a validation error.
|
|
var ErrInvalidUsage = errors.New("invalid command usage")
|
|
|
|
// Validate can be used as a command's Before function to validate the arguments
|
|
// to the command.
|
|
func Validate(vs ...Validator) cli.BeforeFunc {
|
|
return func(context *cli.Context) error {
|
|
remaining := context.Args()
|
|
for _, v := range vs {
|
|
consumed := v(remaining)
|
|
if consumed < 0 {
|
|
return ErrInvalidUsage
|
|
}
|
|
remaining = remaining[consumed:]
|
|
}
|
|
|
|
if len(remaining) > 0 {
|
|
return ErrInvalidUsage
|
|
}
|
|
|
|
return nil
|
|
}
|
|
}
|