1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- package cli
- import (
- "errors"
- "flag"
- "fmt"
- "io"
- )
- type GlobalOpts struct {
- ConfigPath string
- Debug bool
- ConfigStanza string
- }
- func (o GlobalOpts) String() string {
- return "--config --debug --account"
- }
- type Command interface {
- Func([]string) error
- Help(io.Writer, *flag.FlagSet)
- }
- type CommandMap map[string]Command
- type ProgramInfo struct {
- Name string
- Opts GlobalOpts
- Commands CommandMap
- }
- func Usage(w io.Writer, info ProgramInfo) {
- fmt.Fprintf(w, "USAGE: %s [%s] SUBCOMMAND [subcommand opts]\n", info.Name, info.Opts)
- fmt.Fprintf(w, "\nSUBCOMMANDS:\n")
- for command := range info.Commands {
- fmt.Fprintf(w, "\t%s\n", command)
- }
- }
- type Pair struct {
- Set, Unset bool
- }
- type PairFlag struct {
- *Pair
- }
- func NewPairFlag() PairFlag {
- return PairFlag{
- &Pair{false, false},
- }
- }
- func (p Pair) String() string {
- switch p {
- case Pair{true, false}:
- return "set"
- case Pair{false, true}:
- return "unset"
- default:
- return "undef"
- }
- }
- func (pf PairFlag) String() string {
- return fmt.Sprint(pf.Pair)
- }
- func (pf PairFlag) Set(s string) error {
- if s == "set" {
- v := Pair{true, false}
- *pf.Pair = v
- return nil
- }
- if s == "unset" {
- v := Pair{false, true}
- *pf.Pair = v
- return nil
- }
- return ErrAllowedPairFlagValues
- }
- var ErrAllowedPairFlagValues = errors.New("only `set` or `unset` are allowed")
|