| 97 | } |
| 98 | |
| 99 | func (p *Parser) Parse(raw interface{}, variablesMapping map[string]interface{}) (interface{}, error) { |
| 100 | rawValue := reflect.ValueOf(raw) |
| 101 | switch rawValue.Kind() { |
| 102 | case reflect.String: |
| 103 | // json.Number |
| 104 | if rawValue, ok := raw.(builtinJSON.Number); ok { |
| 105 | return parseJSONNumber(rawValue) |
| 106 | } |
| 107 | // other string |
| 108 | value := rawValue.String() |
| 109 | value = strings.TrimSpace(value) |
| 110 | return p.ParseString(value, variablesMapping) |
| 111 | case reflect.Slice: |
| 112 | parsedSlice := make([]interface{}, rawValue.Len()) |
| 113 | for i := 0; i < rawValue.Len(); i++ { |
| 114 | parsedValue, err := p.Parse(rawValue.Index(i).Interface(), variablesMapping) |
| 115 | if err != nil { |
| 116 | return raw, err |
| 117 | } |
| 118 | parsedSlice[i] = parsedValue |
| 119 | } |
| 120 | return parsedSlice, nil |
| 121 | case reflect.Map: // convert any map to map[string]interface{} |
| 122 | parsedMap := make(map[string]interface{}) |
| 123 | for _, k := range rawValue.MapKeys() { |
| 124 | parsedKey, err := p.ParseString(k.String(), variablesMapping) |
| 125 | if err != nil { |
| 126 | return raw, err |
| 127 | } |
| 128 | v := rawValue.MapIndex(k) |
| 129 | parsedValue, err := p.Parse(v.Interface(), variablesMapping) |
| 130 | if err != nil { |
| 131 | return raw, err |
| 132 | } |
| 133 | |
| 134 | key := convertString(parsedKey) |
| 135 | parsedMap[key] = parsedValue |
| 136 | } |
| 137 | return parsedMap, nil |
| 138 | default: |
| 139 | // other types, e.g. nil, int, float, bool |
| 140 | return builtin.TypeNormalization(raw), nil |
| 141 | } |
| 142 | } |
| 143 | |
| 144 | func parseJSONNumber(raw builtinJSON.Number) (value interface{}, err error) { |
| 145 | if strings.Contains(raw.String(), ".") { |