0
|
1 package growsync
|
|
2
|
|
3 import (
|
|
4 "context"
|
|
5 "flag"
|
|
6 "fmt"
|
|
7 "io"
|
|
8 "log"
|
|
9
|
|
10 "github.com/pkg/errors"
|
|
11 )
|
|
12
|
|
13 const cmdName = "growsync"
|
|
14
|
|
15 var (
|
5
|
16 subCommands = []cmd{&editCmd{}, &pushCmd{}, &rootCmd{}, &versionCmd{}}
|
0
|
17 dispatch = make(map[string]cmd, len(subCommands))
|
|
18 maxSubcommandName int
|
|
19 )
|
|
20
|
|
21 func init() {
|
|
22 for _, r := range subCommands {
|
|
23 n := r.name()
|
|
24 l := len(n)
|
|
25 if l > maxSubcommandName {
|
|
26 maxSubcommandName = l
|
|
27 }
|
|
28 dispatch[n] = r
|
|
29 }
|
|
30 }
|
|
31
|
|
32 // Run the lectable
|
|
33 func Run(ctx context.Context, argv []string, outStream, errStream io.Writer) error {
|
|
34 log.SetOutput(errStream)
|
4
|
35 nameAndVer := fmt.Sprintf("%s (v%s)", cmdName, version)
|
0
|
36 fs := flag.NewFlagSet(nameAndVer, flag.ContinueOnError)
|
|
37 fs.SetOutput(errStream)
|
|
38 fs.Usage = func() {
|
|
39 fmt.Fprintf(fs.Output(), "Usage of %s:\n", nameAndVer)
|
|
40 fs.PrintDefaults()
|
|
41 fmt.Fprintf(fs.Output(), "\nCommands:\n")
|
|
42 formatCommands(fs.Output())
|
|
43 }
|
|
44 if err := fs.Parse(argv); err != nil {
|
|
45 return err
|
|
46 }
|
|
47
|
|
48 argv = fs.Args()
|
|
49 if len(argv) < 1 {
|
|
50 fs.Usage()
|
|
51 return errors.New("no subcommand specified")
|
|
52 }
|
|
53 rnr, ok := dispatch[argv[0]]
|
|
54 if !ok {
|
|
55 return errors.Errorf("unknown subcommand: %s", argv[0])
|
|
56 }
|
1
|
57
|
|
58 config, err := parseConfig()
|
|
59 if err != nil {
|
|
60 return err
|
|
61 }
|
|
62 return rnr.run(context.Background(), argv[1:], config, outStream, errStream)
|
0
|
63 }
|
|
64
|
|
65 func formatCommands(out io.Writer) {
|
|
66 format := fmt.Sprintf(" %%-%ds %%s\n", maxSubcommandName)
|
|
67 for _, r := range subCommands {
|
|
68 fmt.Fprintf(out, format, r.name(), r.description())
|
|
69 }
|
|
70 }
|