evalRecursive visits the given value recursively and pushes all of them to result
(input []reflect.Value, node *RecursiveNode)
| 405 | |
| 406 | // evalRecursive visits the given value recursively and pushes all of them to result |
| 407 | func (j *JSONPath) evalRecursive(input []reflect.Value, node *RecursiveNode) ([]reflect.Value, error) { |
| 408 | result := []reflect.Value{} |
| 409 | for _, value := range input { |
| 410 | results := []reflect.Value{} |
| 411 | value, isNil := template.Indirect(value) |
| 412 | if isNil { |
| 413 | continue |
| 414 | } |
| 415 | |
| 416 | kind := value.Kind() |
| 417 | if kind == reflect.Struct { |
| 418 | for i := 0; i < value.NumField(); i++ { |
| 419 | results = append(results, value.Field(i)) |
| 420 | } |
| 421 | } else if kind == reflect.Map { |
| 422 | for _, key := range value.MapKeys() { |
| 423 | results = append(results, value.MapIndex(key)) |
| 424 | } |
| 425 | } else if kind == reflect.Array || kind == reflect.Slice || kind == reflect.String { |
| 426 | for i := 0; i < value.Len(); i++ { |
| 427 | results = append(results, value.Index(i)) |
| 428 | } |
| 429 | } |
| 430 | if len(results) != 0 { |
| 431 | result = append(result, value) |
| 432 | output, err := j.evalRecursive(results, node) |
| 433 | if err != nil { |
| 434 | return result, err |
| 435 | } |
| 436 | result = append(result, output...) |
| 437 | } |
| 438 | } |
| 439 | return result, nil |
| 440 | } |
| 441 | |
| 442 | // evalFilter filters array according to FilterNode |
| 443 | func (j *JSONPath) evalFilter(input []reflect.Value, node *FilterNode) ([]reflect.Value, error) { |