diff --git a/src/matchers.rs b/src/matchers.rs index 2c67c83..1bbc488 100644 --- a/src/matchers.rs +++ b/src/matchers.rs @@ -33,10 +33,10 @@ pub struct WildcardedChild {} impl Matcher for WildcardedChild { fn select<'a>(&self, node: &'a Value) -> Iter<'a> { - if let Some(m) = node.as_object() { - Box::new(m.values()) - } else { - Box::new(iter::empty()) + match node { + Value::Object(m) => Box::new(m.values()), + Value::Array(a) => Box::new(a.iter()), + _ => Box::new(iter::empty()), } } } @@ -75,3 +75,25 @@ impl Matcher for Union { Box::new(self.elements.iter().flat_map(move |it| it.select(node))) } } + +#[cfg(test)] +mod tests { + use super::*; + use serde_json::{json, Value}; + + #[test] + fn object_wildcard() { + let s = WildcardedChild {}; + let j = json!({"a": 1, "b": 2}); + let r: Vec<&Value> = s.select(&j).collect(); + assert_eq!(format!("{:?}", r), "[Number(1), Number(2)]"); + } + + #[test] + fn array_wildcard() { + let s = WildcardedChild {}; + let j = json!([1, 2]); + let r: Vec<&Value> = s.select(&j).collect(); + assert_eq!(format!("{:?}", r), "[Number(1), Number(2)]"); + } +} diff --git a/tests/cts.json b/tests/cts.json index 842118c..f4f27b2 100644 --- a/tests/cts.json +++ b/tests/cts.json @@ -37,7 +37,7 @@ "name": "wildcarded child of array", "selector": "$.*", "document": ["first", "second"], - "result": [] + "result": ["first", "second"] }, { "name": "wildcarded child dot child", "selector": "$.*.a",