ParseArguments returns arguments parsed from JSON. If coerceStr is true, will attempt to parse as string if parsing initially fails.
(in string, coerceStr bool)
| 141 | |
| 142 | // ParseArguments returns arguments parsed from JSON. If coerceStr is true, will attempt to parse as string if parsing initially fails. |
| 143 | func ParseArguments(in string, coerceStr bool) (args []*pb.Argument, err error) { |
| 144 | var data interface{} |
| 145 | err = json.Unmarshal([]byte(in), &data) |
| 146 | if err != nil { |
| 147 | // if coercion is requested, attempt to process input as string |
| 148 | if strings.HasPrefix(err.Error(), "invalid character") && coerceStr { |
| 149 | in = fmt.Sprintf(`"%s"`, in) |
| 150 | args, err = ParseArguments(in, false) |
| 151 | } |
| 152 | return |
| 153 | } |
| 154 | |
| 155 | var dataArr []interface{} |
| 156 | if arr, isArray := data.([]interface{}); isArray { |
| 157 | dataArr = arr |
| 158 | } else { |
| 159 | dataArr = []interface{}{data} |
| 160 | } |
| 161 | |
| 162 | args = make([]*pb.Argument, len(dataArr)) |
| 163 | for k, v := range dataArr { |
| 164 | arg, err := argFromJSONType(v) |
| 165 | if err != nil { |
| 166 | return nil, err |
| 167 | } |
| 168 | args[k] = arg |
| 169 | } |
| 170 | return |
| 171 | } |
| 172 | |
| 173 | func argFromJSONType(data interface{}) (*pb.Argument, error) { |
| 174 | arg := &pb.Argument{} |
no test coverage detected