jsonpath_rust/query/
jp_query.rs

1use crate::parser::model::{JpQuery, Segment};
2use crate::query::queryable::Queryable;
3use crate::query::state::State;
4use crate::query::Query;
5
6impl Query for JpQuery {
7    fn process<'a, T: Queryable>(&self, state: State<'a, T>) -> State<'a, T> {
8        self.segments.process(state)
9    }
10}
11
12impl Query for Vec<Segment> {
13    fn process<'a, T: Queryable>(&self, state: State<'a, T>) -> State<'a, T> {
14        self.iter()
15            .fold(state, |next, segment| segment.process(next))
16    }
17}
18
19#[cfg(test)]
20mod tests {
21    use crate::parser::model::{JpQuery, Segment, Selector};
22    use crate::query::state::{Data, Pointer, State};
23    use crate::query::Query;
24    use serde_json::json;
25
26    #[test]
27    fn test_process() {
28        let value = json!({
29          "result": [
30            {
31              "message": "Hello, Emmy! Your order number is: #100",
32              "phoneNumber": "255-301-9429",
33              "phoneVariation": "+90 398 588 10 73",
34              "status": "active",
35              "name": {
36                "first": "Blaise",
37                "middle": "Kyle",
38                "last": "Fadel"
39              }
40            }
41          ]
42        });
43
44        let query = JpQuery::new(vec![
45            Segment::Selector(Selector::Name("result".to_string())),
46            Segment::Selector(Selector::Index(0)),
47            Segment::Selector(Selector::Name("name".to_string())),
48            Segment::Selector(Selector::Name("first".to_string())),
49        ]);
50
51        let state = State::data(&value, Data::new_ref(Pointer::new(&value, "$".to_string())));
52
53        let result = query.process(state);
54        assert_eq!(
55            result.ok_ref(),
56            Some(vec![Pointer::new(
57                &json!("Blaise"),
58                "$['result'][0]['name']['first']".to_string()
59            )])
60        );
61    }
62}