80 lines
1.6 KiB
Go
80 lines
1.6 KiB
Go
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 l’argument à partir de l’entré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 l’argument 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 l’argument.
|
||
func (a *Arg) Name() string {
|
||
return a.name
|
||
}
|
||
|
||
// Usage retourne l’aide sur l’utilisation de l’argument.
|
||
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, l’argument peut recevoir un nombre d’éléments indéterminé.
|
||
// Si nbargs = 0, l’argument 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,
|
||
}
|
||
}
|