(rawValues []interface{}, returnTypes []interface{})
| 277 | } |
| 278 | |
| 279 | func parseReturnNeoValueArray(rawValues []interface{}, returnTypes []interface{}) ([]interface{}, error) { |
| 280 | values := make([]interface{}, 0) |
| 281 | for i := 0; i < len(rawValues); i++ { |
| 282 | rawValue := rawValues[i] |
| 283 | if i == len(returnTypes) { |
| 284 | return values, nil |
| 285 | } |
| 286 | valueType := returnTypes[i] |
| 287 | |
| 288 | var err error |
| 289 | switch v := rawValue.(type) { |
| 290 | case string: |
| 291 | var value interface{} |
| 292 | vType := valueType.(string) |
| 293 | switch strings.ToLower(vType) { |
| 294 | case PARAM_TYPE_BYTE_ARRAY: |
| 295 | value, err = ParseNeoVMContractReturnTypeByteArray(v) |
| 296 | case PARAM_TYPE_STRING: |
| 297 | value, err = ParseNeoVMContractReturnTypeString(v) |
| 298 | case PARAM_TYPE_INTEGER: |
| 299 | value, err = ParseNeoVMContractReturnTypeInteger(v) |
| 300 | case PARAM_TYPE_BOOLEAN: |
| 301 | value, err = ParseNeoVMContractReturnTypeBool(v) |
| 302 | default: |
| 303 | return nil, fmt.Errorf("unknown return type:%s", v) |
| 304 | } |
| 305 | values = append(values, value) |
| 306 | if err != nil { |
| 307 | return nil, fmt.Errorf("parse return value:%s type:byte array error:%s", v, err) |
| 308 | } |
| 309 | case []interface{}: |
| 310 | valueTypes, ok := valueType.([]interface{}) |
| 311 | if !ok { |
| 312 | return nil, fmt.Errorf("parse return value:%+v types:%s failed, types doesnot match", v, valueType) |
| 313 | } |
| 314 | values, err := parseReturnNeoValueArray(v, valueTypes) |
| 315 | if err != nil { |
| 316 | return nil, fmt.Errorf("parese return values:%+v types:%s error:%s", values, valueType, err) |
| 317 | } |
| 318 | default: |
| 319 | return nil, fmt.Errorf("unknown return type:%s", reflect.TypeOf(rawValue)) |
| 320 | } |
| 321 | } |
| 322 | return values, nil |
| 323 | } |
| 324 | |
| 325 | //NeoVMInvokeParam use to express the param to invoke neovm contract. |
| 326 | //Type can be of array, bytearray, string, int and bool |
no test coverage detected