gob/shell/command/flag/arg.go

80 lines
1.6 KiB
Go
Raw Permalink Normal View History

2023-10-05 08:42:40 +00:00
package flag
import (
"fmt"
. "gitea.zaclys.com/bvaudour/gob/option"
)
// Arg représente un argument de commande
type Arg struct {
name string
usage string
value *[]string
nb int
}
// Parse parse largument à partir de lentrée fournie
// et retourne les éléments restant à parser.
// Si le parsage échoue, une erreur est retournée.
func (a *Arg) Parse(args []string) (next Result[[]string]) {
l := len(args)
switch a.nb {
case -1:
*a.value = make([]string, l)
copy(*a.value, args)
case 0:
if l > 0 {
next, *a.value = Ok(args[1:]), []string{args[0]}
}
default:
if l < a.nb {
next = Err[[]string](fmt.Errorf("Not enough args for %s", a.name))
} else {
*a.value = make([]string, a.nb)
copy(*a.value, args[:a.nb])
next = Ok(args[a.nb:])
}
}
return
}
// IsParsed retourne vrai si largument a déjà été parsé.
func (a *Arg) IsParsed() bool {
return len(*a.value) > 0
}
// Reset réinitialise le parsage.
func (a *Arg) Reset() {
*a.value = []string{}
}
// Name retourne le nom de largument.
func (a *Arg) Name() string {
return a.name
}
// Usage retourne laide sur lutilisation de largument.
func (a *Arg) Usage() string {
return a.usage
}
// NewArg retourne un nouvel argument avec son nom, sa description
// le nombre déléments attendu et un pointeur vers la valeur parsée.
//
// Si nbargs < 0, largument peut recevoir un nombre déléments indéterminé.
// Si nbargs = 0, largument est facultatif.
func NewArg(name, usage string, nbargs int, value *[]string) *Arg {
if nbargs < 0 {
nbargs = -1
}
return &Arg{
name: name,
usage: usage,
value: value,
nb: nbargs,
}
}