Fix up the recursive descent
This commit is contained in:
@@ -2,6 +2,7 @@ package jsonpath
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -119,7 +120,10 @@ func evalStep(node interface{}, step JSONStep) []interface{} {
|
|||||||
return evalWildcard(node)
|
return evalWildcard(node)
|
||||||
case IndexStep:
|
case IndexStep:
|
||||||
return evalIndex(node, step.Index)
|
return evalIndex(node, step.Index)
|
||||||
|
case RootStep:
|
||||||
|
return []interface{}{node}
|
||||||
default:
|
default:
|
||||||
|
log.Println("Unknown step type:", step.Type)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -141,12 +145,15 @@ func evalRecursiveDescent(node interface{}, targetKey string) []interface{} {
|
|||||||
current := queue[0]
|
current := queue[0]
|
||||||
queue = queue[1:]
|
queue = queue[1:]
|
||||||
|
|
||||||
if m, ok := current.(map[string]interface{}); ok {
|
if targetKey == "*" {
|
||||||
// Check if current level has target key
|
results = append(results, current)
|
||||||
|
} else if m, ok := current.(map[string]interface{}); ok {
|
||||||
if val, exists := m[targetKey]; exists {
|
if val, exists := m[targetKey]; exists {
|
||||||
results = append(results, val)
|
results = append(results, val)
|
||||||
}
|
}
|
||||||
// Add all children to queue
|
}
|
||||||
|
|
||||||
|
if m, ok := current.(map[string]interface{}); ok {
|
||||||
for _, v := range m {
|
for _, v := range m {
|
||||||
queue = append(queue, v)
|
queue = append(queue, v)
|
||||||
}
|
}
|
||||||
|
@@ -173,9 +173,24 @@ func TestEvaluator(t *testing.T) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if !reflect.DeepEqual(result, tt.expected) {
|
if len(result) != len(tt.expected) {
|
||||||
t.Errorf("EvaluateJSONPath() = %v, want %v", result, tt.expected)
|
t.Errorf("Expected %d items, got %d", len(tt.expected), len(result))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
expectedSet := make(map[interface{}]bool, len(tt.expected))
|
||||||
|
for _, expected := range tt.expected {
|
||||||
|
expectedSet[expected] = true
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, resultItem := range result {
|
||||||
|
if !expectedSet[resultItem] {
|
||||||
|
t.Errorf("Expected %v, got %v", tt.expected, resultItem)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if !reflect.DeepEqual(result, tt.expected) {
|
||||||
|
// t.Errorf("EvaluateJSONPath() = %v, want %v", result, tt.expected)
|
||||||
|
// }
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user