| 14 | ) |
| 15 | |
| 16 | func parseFields(opts *ApiOptions) (map[string]interface{}, error) { |
| 17 | params := make(map[string]interface{}) |
| 18 | parseField := func(f string, isMagic bool) error { |
| 19 | var valueIndex int |
| 20 | var keystack []string |
| 21 | keyStartAt := 0 |
| 22 | parseLoop: |
| 23 | for i, r := range f { |
| 24 | switch r { |
| 25 | case keyStart: |
| 26 | if keyStartAt == 0 { |
| 27 | keystack = append(keystack, f[0:i]) |
| 28 | } |
| 29 | keyStartAt = i + 1 |
| 30 | case keyEnd: |
| 31 | keystack = append(keystack, f[keyStartAt:i]) |
| 32 | case keySeparator: |
| 33 | if keyStartAt == 0 { |
| 34 | keystack = append(keystack, f[0:i]) |
| 35 | } |
| 36 | valueIndex = i + 1 |
| 37 | break parseLoop |
| 38 | } |
| 39 | } |
| 40 | |
| 41 | if len(keystack) == 0 { |
| 42 | return fmt.Errorf("invalid key: %q", f) |
| 43 | } |
| 44 | |
| 45 | key := f |
| 46 | var value interface{} = nil |
| 47 | if valueIndex == 0 { |
| 48 | if keystack[len(keystack)-1] != "" { |
| 49 | return fmt.Errorf("field %q requires a value separated by an '=' sign", key) |
| 50 | } |
| 51 | } else { |
| 52 | key = f[0 : valueIndex-1] |
| 53 | value = f[valueIndex:] |
| 54 | } |
| 55 | |
| 56 | if isMagic && value != nil { |
| 57 | var err error |
| 58 | value, err = magicFieldValue(value.(string), opts) |
| 59 | if err != nil { |
| 60 | return fmt.Errorf("error parsing %q value: %w", key, err) |
| 61 | } |
| 62 | } |
| 63 | |
| 64 | destMap := params |
| 65 | isArray := false |
| 66 | var subkey string |
| 67 | for _, k := range keystack { |
| 68 | if k == "" { |
| 69 | isArray = true |
| 70 | continue |
| 71 | } |
| 72 | if subkey != "" { |
| 73 | var err error |