50 lines
1.0 KiB
Go
50 lines
1.0 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"flag"
|
|
"fmt"
|
|
)
|
|
|
|
type arrayFlags struct {
|
|
name string
|
|
v *[]string
|
|
setCalled bool
|
|
}
|
|
|
|
func (i *arrayFlags) String() string {
|
|
if i.v == nil {
|
|
return ""
|
|
}
|
|
var buffer bytes.Buffer
|
|
for _, cmd := range *i.v {
|
|
if _, err := buffer.WriteString(fmt.Sprintf("-%s %s ", i.name, cmd)); err != nil {
|
|
panic("error parsing array flags")
|
|
}
|
|
}
|
|
return buffer.String()
|
|
}
|
|
|
|
func (i *arrayFlags) Set(value string) error {
|
|
if !i.setCalled {
|
|
*i.v = (*i.v)[:0]
|
|
i.setCalled = true
|
|
}
|
|
*i.v = append(*i.v, value)
|
|
return nil
|
|
}
|
|
|
|
func newArrayFlag(name string, val []string, p *[]string) *arrayFlags {
|
|
*p = val
|
|
a := &arrayFlags{name: name, v: p}
|
|
return a
|
|
}
|
|
|
|
// ArrayVar defines an []string flag with specified name, default value, and usage string.
|
|
// The return value is the address of an []string variable that stores the value of the flag.
|
|
func ArrayVar(name string, value []string, usage string) *[]string {
|
|
p := new([]string)
|
|
flag.CommandLine.Var(newArrayFlag(name, value, p), name, usage)
|
|
return p
|
|
}
|