| 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 |  | 
|---|