summaryrefslogtreecommitdiff
path: root/cmd/args.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/args.go')
-rw-r--r--cmd/args.go97
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, "--")
+}