// 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 } if num, err := strconv.ParseFloat(arg, 64); err == nil { return num } return arg } func isFlag(arg string) bool { return strings.HasPrefix(arg, "--") }