diff options
| author | Philipp Tanlak <philipp.tanlak@gmail.com> | 2023-11-18 22:49:26 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-18 22:49:26 +0100 |
| commit | 6aa52bdbe2cefdbc9219abfb4399afa0d492913d (patch) | |
| tree | 02c743b7d9393dbf024e14adada73c6594bdd34a /cmd/args.go | |
| parent | 94da9293f63e46712b0a890e1e0eab4153fdb3f9 (diff) | |
Support passing config options as CLI arguments (#15)
Diffstat (limited to 'cmd/args.go')
| -rw-r--r-- | cmd/args.go | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/cmd/args.go b/cmd/args.go new file mode 100644 index 0000000..e11308b --- /dev/null +++ b/cmd/args.go @@ -0,0 +1,97 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package cmd + +import ( + "fmt" + "slices" + "strconv" + "strings" +) + +var arrayFields = []string{ + "urls", + "follow", + "allowedDomains", + "blockedDomains", + "allowedURLs", + "blockedURLs", + "proxies", +} + +func parseConfigArgs(args []string) (map[string]any, error) { + updates := map[string]any{} + + flag := "" + for _, arg := range normalizeArgs(args) { + if flag == "" && !isFlag(arg) { + return nil, fmt.Errorf("expected flag, got %q instead", arg) + } + + if flag != "" && isFlag(arg) { + updates[flag[2:]] = true + flag = "" + continue + } + + if flag != "" { + if v, ok := updates[flag[2:]]; ok { + if vv, ok := v.([]any); ok { + updates[flag[2:]] = append(vv, parseArg(arg)) + } else { + updates[flag[2:]] = []any{v, parseArg(arg)} + } + } else { + if slices.Contains(arrayFields, flag[2:]) { + updates[flag[2:]] = []any{parseArg(arg)} + } else { + updates[flag[2:]] = parseArg(arg) + } + } + flag = "" + continue + } + + flag = arg + } + + if flag != "" { + updates[flag[2:]] = true + flag = "" + } + + return updates, nil +} + +func normalizeArgs(args []string) []string { + var norm []string + + for _, arg := range args { + if !strings.HasPrefix(arg, "--") { + norm = append(norm, arg) + } else { + norm = append(norm, strings.SplitN(arg, "=", 2)...) + } + } + + return norm +} + +func parseArg(arg string) any { + if arg == "true" { + return true + } + if arg == "false" { + return false + } + if num, err := strconv.Atoi(arg); err == nil { + return num + } + return arg +} + +func isFlag(arg string) bool { + return strings.HasPrefix(arg, "--") +} |