1 | use crate::parser::model::{JpQuery, Segment};
|
2 | use crate::query::queryable::Queryable;
|
3 | use crate::query::state::State;
|
4 | use crate::query::Query;
|
5 |
|
6 | impl 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 |
|
12 | impl Query for Vec<Segment> {
|
13 | fn process<'a, T: Queryable>(&self, state: State<'a, T>) -> State<'a, T> {
|
14 | self.iter()
|
15 | .fold(init:state, |next: State<'a, T>, segment: &Segment| segment.process(state:next))
|
16 | }
|
17 | }
|
18 |
|
19 | #[cfg (test)]
|
20 | mod 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 | }
|
63 | |