@@ -5,6 +5,7 @@ use crate::parser::model2::{Comparable, Comparison, Filter, FilterAtom, FnArg, J
55use crate :: path:: JsonLike ;
66use pest:: iterators:: { Pair , Pairs } ;
77use pest:: Parser ;
8+ use crate :: JsonPath ;
89
910#[ derive( Parser ) ]
1011#[ grammar = "parser/grammar/json_path_9535.pest" ]
@@ -14,6 +15,20 @@ const MIN_VAL: i64 = -9007199254740991; // Minimum safe integer value in JavaScr
1415
1516pub ( super ) type Parsed < T > = Result < T , JsonPathParserError > ;
1617
18+ /// Parses a string into a [JsonPath].
19+ ///
20+ /// # Errors
21+ ///
22+ /// Returns a variant of [crate::JsonPathParserError] if the parsing operation failed.
23+ pub fn parse_json_path ( jp_str : & str ) -> Parsed < JpQuery >
24+ {
25+ JSPathParser :: parse ( Rule :: main, jp_str)
26+ . map_err ( Box :: new) ?
27+ . next ( )
28+ . ok_or ( JsonPathParserError :: UnexpectedPestOutput )
29+ . and_then ( jp_query)
30+ }
31+
1732pub fn jp_query ( rule : Pair < Rule > ) -> Parsed < JpQuery > {
1833 Ok ( JpQuery :: new ( segments ( rule) ?) )
1934}
@@ -32,7 +47,7 @@ pub fn segment(rule: Pair<Rule>) -> Parsed<Segment> {
3247 let next = next_down ( child) ?;
3348 match next. as_rule ( ) {
3449 Rule :: wildcard_selector => Ok ( Segment :: Selector ( Selector :: Wildcard ) ) ,
35- Rule :: member_name_shorthand => Ok ( Segment :: name ( next. as_str ( ) ) ) ,
50+ Rule :: member_name_shorthand => Ok ( Segment :: name ( next. as_str ( ) . trim ( ) ) ) ,
3651 Rule :: bracketed_selection => {
3752 let mut selectors = vec ! [ ] ;
3853 for r in next. into_inner ( ) {
@@ -58,7 +73,7 @@ pub fn segment(rule: Pair<Rule>) -> Parsed<Segment> {
5873pub fn selector ( rule : Pair < Rule > ) -> Parsed < Selector > {
5974 let child = next_down ( rule) ?;
6075 match child. as_rule ( ) {
61- Rule :: name_selector => Ok ( Selector :: Name ( child. as_str ( ) . to_string ( ) ) ) ,
76+ Rule :: name_selector => Ok ( Selector :: Name ( child. as_str ( ) . trim ( ) . to_string ( ) ) ) ,
6277 Rule :: wildcard_selector => Ok ( Selector :: Wildcard ) ,
6378 Rule :: index_selector => Ok ( Selector :: Index (
6479 child. as_str ( ) . parse :: < i64 > ( ) . map_err ( |e| ( e, "int" ) ) ?,
@@ -67,7 +82,7 @@ pub fn selector(rule: Pair<Rule>) -> Parsed<Selector> {
6782 let ( start, end, step) = slice_selector ( child) ?;
6883 Ok ( Selector :: Slice ( start, end, step) )
6984 }
70- Rule :: filter_selector => Ok ( Selector :: Filter ( logical_expr ( child) ?) ) ,
85+ Rule :: filter_selector => Ok ( Selector :: Filter ( logical_expr ( next_down ( child) ? ) ?) ) ,
7186 _ => Err ( child. into ( ) ) ,
7287 }
7388}
@@ -76,7 +91,7 @@ pub fn function_expr(rule: Pair<Rule>) -> Parsed<TestFunction> {
7691 let mut elems = rule. into_inner ( ) ;
7792 let name = elems
7893 . next ( )
79- . map ( |e| e. as_str ( ) )
94+ . map ( |e| e. as_str ( ) . trim ( ) )
8095 . ok_or ( JsonPathParserError :: empty ( "function expression" ) ) ?
8196 ;
8297 let mut args = vec ! [ ] ;
@@ -125,7 +140,7 @@ pub fn singular_query_segments(rule: Pair<Rule>) -> Parsed<Vec<SingularQuerySegm
125140 for r in rule. into_inner ( ) {
126141 match r. as_rule ( ) {
127142 Rule :: name_segment => {
128- segments. push ( SingularQuerySegment :: Name ( next_down ( r) ?. as_str ( ) . to_string ( ) ) ) ;
143+ segments. push ( SingularQuerySegment :: Name ( next_down ( r) ?. as_str ( ) . trim ( ) . to_string ( ) ) ) ;
129144 }
130145 Rule :: index_segment => {
131146 segments. push ( SingularQuerySegment :: Index (
@@ -195,6 +210,7 @@ pub fn comp_expr(rule:Pair<Rule>) -> Parsed<Comparison> {
195210
196211pub fn literal ( rule : Pair < Rule > ) -> Parsed < Literal > {
197212 fn parse_number ( num : & str ) -> Parsed < Literal > {
213+ let num = num. trim ( ) ;
198214 if num. contains ( '.' ) {
199215 Ok ( Literal :: Float ( num. parse :: < f64 > ( ) . map_err ( |e| ( e, num) ) ?) )
200216 } else {
@@ -223,6 +239,7 @@ pub fn literal(rule: Pair<Rule>) -> Parsed<Literal> {
223239
224240pub fn filter_atom ( pair : Pair < Rule > ) -> Parsed < FilterAtom > {
225241 let rule = next_down ( pair) ?;
242+
226243 match rule. as_rule ( ) {
227244 Rule :: paren_expr => {
228245 let mut not = false ;
0 commit comments