-
Notifications
You must be signed in to change notification settings - Fork 0
/
flags.go
66 lines (57 loc) · 1.31 KB
/
flags.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package subcommands
import (
_ "embed"
"fmt"
"os"
"regexp"
"github.com/spf13/pflag"
)
var (
//go:embed templates/usage.txt
usageIntro string
)
var allFlagSets []*FlagSet = make([]*FlagSet, 0)
type FlagSet struct {
*pflag.FlagSet
// Error func(err error)
// UsageExit func()
Name string
}
func (f *FlagSet) Error(err error) {
reindent := regexp.MustCompile(`(?is)(\s*)(-)(.*?\n)`)
fmt.Printf("error: %v\n", err)
fmt.Print(usageIntro)
for _, f := range allFlagSets {
f.dumpUsage(reindent)
}
os.Exit(1)
}
func NewFlagSet(name string) *FlagSet {
fs := &FlagSet{FlagSet: pflag.NewFlagSet(name, pflag.ContinueOnError), Name: name}
allFlagSets = append(allFlagSets, fs)
fs.FlagSet.Usage = Usage()
// fs.UsageExit = func() { fs.Usage(); os.Exit(0) }
// fs.Error = func(err error) { fmt.Printf("%v\n", err); fs.Usage(); os.Exit(1) }
return fs
}
var Usage = func() func() {
reindent := regexp.MustCompile(`(?is)(\s*)(-)(.*?\n)`)
return func() {
fmt.Print(usageIntro)
for _, f := range allFlagSets {
f.dumpUsage(reindent)
}
os.Exit(0)
}
}
func (fs *FlagSet) dumpUsage(reindent *regexp.Regexp) {
if !fs.HasFlags() {
return
}
h := fmt.Sprintf("-%s: \n", fs.Name)
fmt.Print(
reindent.ReplaceAllString(h, " $1$3"),
reindent.ReplaceAllString(fs.FlagUsages(), " $1$2$3"),
"\n",
)
}