| 77 | } |
| 78 | |
| 79 | func (j *JSONPath) FindResults(data interface{}) ([][]reflect.Value, error) { |
| 80 | if j.parser == nil { |
| 81 | return nil, fmt.Errorf("%s is an incomplete jsonpath template", j.name) |
| 82 | } |
| 83 | |
| 84 | j.cur = []reflect.Value{reflect.ValueOf(data)} |
| 85 | nodes := j.parser.Root.Nodes |
| 86 | fullResult := [][]reflect.Value{} |
| 87 | for i := 0; i < len(nodes); i++ { |
| 88 | node := nodes[i] |
| 89 | results, err := j.walk(j.cur, node) |
| 90 | if err != nil { |
| 91 | return nil, err |
| 92 | } |
| 93 | |
| 94 | // encounter an end node, break the current block |
| 95 | if j.endRange > 0 && j.endRange <= j.inRange { |
| 96 | j.endRange-- |
| 97 | break |
| 98 | } |
| 99 | // encounter a range node, start a range loop |
| 100 | if j.beginRange > 0 { |
| 101 | j.beginRange-- |
| 102 | j.inRange++ |
| 103 | for k, value := range results { |
| 104 | j.parser.Root.Nodes = nodes[i+1:] |
| 105 | if k == len(results)-1 { |
| 106 | j.inRange-- |
| 107 | } |
| 108 | nextResults, err := j.FindResults(value.Interface()) |
| 109 | if err != nil { |
| 110 | return nil, err |
| 111 | } |
| 112 | fullResult = append(fullResult, nextResults...) |
| 113 | } |
| 114 | break |
| 115 | } |
| 116 | fullResult = append(fullResult, results) |
| 117 | } |
| 118 | return fullResult, nil |
| 119 | } |
| 120 | |
| 121 | // PrintResults writes the results into writer |
| 122 | func (j *JSONPath) PrintResults(wr io.Writer, results []reflect.Value) error { |