Skip to content

Commit 11e7da2

Browse files
committed
refactor arg parsing; add -f force flag
1 parent 44eaa61 commit 11e7da2

File tree

3 files changed

+106
-7
lines changed

3 files changed

+106
-7
lines changed

config.go

+2
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ import (
1010
type config struct {
1111
out io.Writer
1212
customName string
13+
*typewriter.Config
1314
}
1415

1516
var defaultConfig = config{
1617
out: os.Stdout,
1718
customName: "_gen.go",
19+
Config: &typewriter.Config{},
1820
}
1921

2022
// keep in sync with imports.go

main.go

+50-7
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
package main
33

44
import (
5+
"fmt"
56
"os"
67
"regexp"
78
)
@@ -26,16 +27,17 @@ var exitStatusMsg = regexp.MustCompile(`^exit status \d+$`)
2627
func runMain(args []string) error {
2728
c := defaultConfig
2829

29-
if len(args) == 1 {
30-
// simply typed 'gen'; run is the default command
31-
return run(c)
30+
cmd, force, tail, err := parseArgs(args)
31+
32+
if err != nil {
33+
return err
3234
}
3335

34-
cmd := args[1]
36+
c.IgnoreTypeCheckErrors = force
3537

36-
var tail []string
37-
if len(args) > 2 {
38-
tail = args[2:]
38+
if len(cmd) == 0 {
39+
// simply typed 'gen'; run is the default command
40+
return run(c)
3941
}
4042

4143
switch cmd {
@@ -51,3 +53,44 @@ func runMain(args []string) error {
5153
return help(c)
5254
}
5355
}
56+
57+
var s = struct{}{}
58+
59+
var cmds = map[string]struct{}{
60+
"add": s,
61+
"get": s,
62+
"help": s,
63+
"list": s,
64+
"watch": s,
65+
}
66+
67+
func parseArgs(args []string) (cmd string, force bool, tail []string, err error) {
68+
for _, a := range args[1:] { // arg[0] is 'gen'
69+
if _, ok := cmds[a]; ok {
70+
if len(cmd) > 0 {
71+
err = fmt.Errorf("more than one command specified; type gen help for usage")
72+
break
73+
}
74+
cmd = a
75+
continue
76+
}
77+
if a == "-f" {
78+
force = true
79+
continue
80+
}
81+
tail = append(tail, a)
82+
}
83+
84+
// tail is only valid on add & get; otherwise an error
85+
if len(tail) > 0 && cmd != "add" && cmd != "get" {
86+
err = fmt.Errorf("unknown command(s) %v", tail)
87+
tail = []string{}
88+
}
89+
90+
// force flag is only valid with run & watch
91+
if force && cmd != "" && cmd != "watch" {
92+
err = fmt.Errorf("-f flag is not valid with %q", cmd)
93+
}
94+
95+
return cmd, force, tail, err
96+
}

main_test.go

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package main
2+
3+
import (
4+
"strings"
5+
"testing"
6+
)
7+
8+
type parseTest struct {
9+
text string
10+
cmd string
11+
force bool
12+
tail int //length
13+
err bool //exists
14+
}
15+
16+
func TestParseArgs(t *testing.T) {
17+
tests := []parseTest{
18+
parseTest{"gen", "", false, 0, false},
19+
parseTest{"gen -f", "", true, 0, false},
20+
parseTest{"gen yadda", "", false, 0, true}, // unknown command
21+
parseTest{"gen -bar", "", false, 0, true}, // tail is not ok
22+
parseTest{"gen add", "add", false, 0, false},
23+
parseTest{"gen add foo bar", "add", false, 2, false}, // tail is ok
24+
parseTest{"gen add -f", "add", true, 0, true}, // force is not ok
25+
parseTest{"gen get", "get", false, 0, false},
26+
parseTest{"gen get foo bar", "get", false, 2, false}, // tail is ok
27+
parseTest{"gen get -f", "get", true, 0, true}, // force is not ok
28+
parseTest{"gen help", "help", false, 0, false},
29+
parseTest{"gen help foo bar", "help", false, 0, true}, // tail is not ok
30+
parseTest{"gen help -f", "help", true, 0, true}, // force is not ok
31+
parseTest{"gen list", "list", false, 0, false},
32+
parseTest{"gen list foo bar", "list", false, 0, true}, // tail is not ok
33+
parseTest{"gen list -f", "list", true, 0, true}, // force is not ok
34+
parseTest{"gen watch", "watch", false, 0, false},
35+
parseTest{"gen watch foo bar", "watch", false, 0, true}, // tail is not ok
36+
parseTest{"gen watch -f", "watch", true, 0, false}, // force is ok
37+
}
38+
39+
for i, test := range tests {
40+
cmd, force, tail, err := parseArgs(strings.Split(test.text, " "))
41+
if cmd != test.cmd {
42+
t.Errorf("tests[%d]: cmd should be %q, got %q", i, test.cmd, cmd)
43+
}
44+
if force != test.force {
45+
t.Errorf("tests[%d]: force should be %v, got %v", i, test.force, force)
46+
}
47+
if len(tail) != test.tail {
48+
t.Errorf("tests[%d]: len(tail) should be %v, got %v", i, test.tail, len(tail))
49+
}
50+
if (err != nil) != test.err {
51+
t.Errorf("tests[%d]: err existence should be %v, got %v", i, test.err, err)
52+
}
53+
}
54+
}

0 commit comments

Comments
 (0)