From 9de2cdec47f3dc766c10198225a917187731d6a6 Mon Sep 17 00:00:00 2001 From: Marko Mikulicic Date: Thu, 1 Oct 2020 13:50:54 +0200 Subject: [PATCH] Implement wildcard matcher for arrays Spec https://jsonpath-standard.github.io/internet-draft/#section-2.6.1 ``` A dot child name consisting of a single asterisk is a wild card. It selects all the values of any object node. It also selects all the elements of any array node. It selects no nodes from number, string, or literal nodes. ``` --- src/matchers.rs | 30 ++++++++++++++++++++++++++---- tests/cts.json | 2 +- 2 files changed, 27 insertions(+), 5 deletions(-) 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",