-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathflags.go
93 lines (77 loc) · 2.15 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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package main
import (
"flag"
"fmt"
"os"
"sort"
"strings"
)
// Defaults
const (
defaultBrowser = browserNameChrome
defaultMaxTabs = 100
defaultPrefix = ""
defaultTemplate = templateURL
)
// Environment variables
const (
envVarPrefix = "PREFIX"
envVarBrowser = "BROWSER"
envVarBrowserArgs = "BROWSER_ARGS"
envVarTemplate = "TEMPLATE"
)
type commonFlags struct {
browser string
maxTabs int
prefix string
clipboard bool
verbose bool
}
// Global instance of the common flag values struct
var cFlags commonFlags
func attachCommonFlags(fs *flag.FlagSet) {
fs.StringVar(&cFlags.browser, "browser", setStringFlagDefault(defaultBrowser, envVarBrowser), "browser name")
fs.IntVar(&cFlags.maxTabs, "max", defaultMaxTabs, "maximum number of tabs")
fs.StringVar(&cFlags.prefix, "prefix", setStringFlagDefault(defaultPrefix, envVarPrefix), "optional prefix for each URL")
fs.BoolVar(&cFlags.clipboard, "clipboard", false, "use clipboard for input/output")
fs.BoolVar(&cFlags.verbose, "verbose", false, "enable verbose output")
}
type commonOptions struct {
browserApp *browserApplication
maxTabs int
prefix string
clipboard bool
verbose bool
}
func parseCommonOptions() (*commonOptions, error) {
opts := &commonOptions{}
// Set browser application
browserApp, validBrowser := browserApplications[strings.ToLower(cFlags.browser)]
if !validBrowser {
names := []string{}
for name := range browserApplications {
names = append(names, name)
}
sort.Strings(names)
return nil, fmt.Errorf("browser must be one of %v", names)
}
opts.browserApp = browserApp
// Set max tabs
if cFlags.maxTabs <= 0 || cFlags.maxTabs > defaultMaxTabs {
return nil, fmt.Errorf("maximum tabs must be in the range [1, %d]", defaultMaxTabs)
}
opts.maxTabs = cFlags.maxTabs
opts.prefix = cFlags.prefix
opts.clipboard = cFlags.clipboard
opts.verbose = cFlags.verbose
return opts, nil
}
func setStringFlagDefault(defaultVal string, envVar string) string {
if val := os.Getenv(getEnvVarName(envVar)); val != "" {
return val
}
return defaultVal
}
func getEnvVarName(e string) string {
return fmt.Sprintf("%s_%s", strings.ToUpper(appName), e)
}