jsonpath_rust/query/
jp_query.rs1use 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}