Skip to content

Commit 634d140

Browse files
authored
Simplify cli flag parsing and passing (#17)
1 parent f8d7bd0 commit 634d140

File tree

1 file changed

+29
-33
lines changed

1 file changed

+29
-33
lines changed

main.go

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -19,40 +19,44 @@ import (
1919
// time with -ldflags.
2020
var version = "development"
2121

22-
func main() {
23-
failed, err := mainCmd()
24-
if err != nil {
25-
fmt.Fprintf(os.Stderr, "retry: %v\n", err)
26-
}
27-
if failed {
28-
os.Exit(1)
29-
}
22+
// cmdFlags represents the assorted command line flags that can be passed.
23+
type cmdFlags struct {
24+
retry.Spec
25+
quiet bool
26+
version bool
3027
}
3128

32-
func mainCmd() (bool, error) {
33-
var spec retry.Spec
34-
var versionFlag bool
35-
var quietFlag bool
36-
flag.IntVar(&spec.Attempts, "attempts", 3, "maximum number of attempts")
37-
flag.BoolVar(&spec.Backoff, "backoff", false, "use exponential backoff when sleeping")
38-
flag.IntVar(&spec.Consecutive, "consecutive", 0, "required number of back to back successes")
39-
flag.DurationVar(&spec.TotalTime, "max-time", time.Minute, "maximum total time")
40-
flag.BoolVar(&quietFlag, "quiet", false, "silence all output")
41-
flag.DurationVar(&spec.Sleep, "sleep", 5*time.Second, "time to sleep between attempts")
42-
flag.DurationVar(&spec.TaskTime, "task-time", 0, "maximum time for a single attempt")
43-
flag.BoolVar(&versionFlag, "version", false, fmt.Sprintf("print the version %q and exit", version))
29+
func main() {
30+
var flags cmdFlags
31+
flag.IntVar(&flags.Attempts, "attempts", 3, "maximum number of attempts")
32+
flag.BoolVar(&flags.Backoff, "backoff", false, "use exponential backoff when sleeping")
33+
flag.IntVar(&flags.Consecutive, "consecutive", 0, "required number of back to back successes")
34+
flag.DurationVar(&flags.TotalTime, "max-time", time.Minute, "maximum total time")
35+
flag.BoolVar(&flags.quiet, "quiet", false, "silence all output")
36+
flag.DurationVar(&flags.Sleep, "sleep", 5*time.Second, "time to sleep between attempts")
37+
flag.DurationVar(&flags.TaskTime, "task-time", 0, "maximum time for a single attempt")
38+
flag.BoolVar(&flags.version, "version", false, fmt.Sprintf("print the version %q and exit", version))
4439
flag.Usage = usage
4540
flag.Parse()
4641

42+
if err := mainCmd(flags); err != nil {
43+
if !flags.quiet {
44+
fmt.Fprintf(os.Stderr, "retry: %v\n", err)
45+
}
46+
os.Exit(1)
47+
}
48+
}
49+
50+
func mainCmd(flags cmdFlags) error {
4751
// If the version flag (-version) was given, print the version and exit.
48-
if versionFlag {
52+
if flags.version {
4953
fmt.Println(version)
50-
return false, nil
54+
return nil
5155
}
5256

5357
// If no arguments were given, there's nothing to do.
5458
if flag.NArg() == 0 {
55-
return true, errors.New("no command given")
59+
return errors.New("no command given")
5660
}
5761

5862
var (
@@ -67,18 +71,10 @@ func mainCmd() (bool, error) {
6771
task = retry.HTTPTask{URL: command}
6872
} else {
6973
// Otherwise, assume the command references a (shell) command.
70-
task = retry.ExecTask{Name: command, Args: args, Quiet: quietFlag}
74+
task = retry.ExecTask{Name: command, Args: args, Quiet: flags.quiet}
7175
}
7276

73-
err := retry.Retry(spec, task)
74-
switch {
75-
case err != nil && quietFlag:
76-
return true, nil // Intentionally silence error.
77-
case err != nil:
78-
return true, err
79-
default:
80-
return false, nil
81-
}
77+
return retry.Retry(flags.Spec, task)
8278
}
8379

8480
func usage() {

0 commit comments

Comments
 (0)