@@ -11,7 +11,8 @@ mod test;
11
11
mod test_function;
12
12
13
13
use crate :: parser:: errors:: JsonPathError ;
14
- use crate :: parser:: parse_json_path;
14
+ use crate :: parser:: model:: JpQuery ;
15
+ use crate :: parser:: { parse_json_path, Parsed } ;
15
16
use crate :: query:: queryable:: Queryable ;
16
17
use crate :: query:: state:: { Data , Pointer } ;
17
18
use state:: State ;
@@ -62,7 +63,16 @@ impl<'a, T: Queryable> From<Pointer<'a, T>> for QueryRef<'a, T> {
62
63
/// The main function to process a JSONPath query.
63
64
/// It takes a path and a value, and returns a vector of `QueryResult` thus values + paths.
64
65
pub fn js_path < ' a , T : Queryable > ( path : & str , value : & ' a T ) -> Queried < Vec < QueryRef < ' a , T > > > {
65
- match parse_json_path ( path) ?. process ( State :: root ( value) ) . data {
66
+ js_path_process ( & parse_json_path ( path) ?, value)
67
+ }
68
+
69
+ /// A convenience function to process a JSONPath query
70
+ /// and return a vector of values, omitting the path.
71
+ pub fn js_path_process < ' a , ' b , T : Queryable > (
72
+ path : & ' b JpQuery ,
73
+ value : & ' a T ,
74
+ ) -> Queried < Vec < QueryRef < ' a , T > > > {
75
+ match path. process ( State :: root ( value) ) . data {
66
76
Data :: Ref ( p) => Ok ( vec ! [ p. into( ) ] ) ,
67
77
Data :: Refs ( refs) => Ok ( refs. into_iter ( ) . map ( Into :: into) . collect ( ) ) ,
68
78
Data :: Value ( v) => Err ( v. into ( ) ) ,
@@ -89,9 +99,9 @@ pub fn js_path_path<T: Queryable>(path: &str, value: &T) -> Queried<Vec<QueryPat
89
99
#[ cfg( test) ]
90
100
mod tests {
91
101
use crate :: parser:: errors:: JsonPathError ;
92
- use crate :: parser:: Parsed ;
102
+ use crate :: parser:: { parse_json_path , Parsed } ;
93
103
use crate :: query:: queryable:: Queryable ;
94
- use crate :: query:: { js_path, Queried , QueryRef } ;
104
+ use crate :: query:: { js_path, js_path_process , Queried , QueryRef } ;
95
105
use crate :: JsonPath ;
96
106
use serde_json:: { json, Value } ;
97
107
@@ -807,4 +817,27 @@ mod tests {
807
817
808
818
Ok ( ( ) )
809
819
}
820
+
821
+ #[ test]
822
+ fn prepared_query ( ) -> Queried < ( ) > {
823
+ let json1 = json ! ( {
824
+ "a" : 1 ,
825
+ "b" : 2 ,
826
+ "c" : 3
827
+ } ) ;
828
+ let json2 = json ! ( {
829
+ "a" : 1 ,
830
+ "b" : 2 ,
831
+ "c" : 3
832
+ } ) ;
833
+
834
+ let jq = parse_json_path ( "$[?@<3]" ) ?;
835
+
836
+ let v1 = js_path_process ( & jq, & json1) ?;
837
+ let v2 = js_path_process ( & jq, & json2) ?;
838
+
839
+ assert_eq ! ( v1, v2) ;
840
+
841
+ Ok ( ( ) )
842
+ }
810
843
}
0 commit comments