1mod path_reader;
2mod tokenizer;
3
4use std::str::FromStr;
5
6use self::tokenizer::*;
7
8const DUMMY: usize = 0;
9
10type ParseResult<T> = Result<T, String>;
11
12mod utils {
13 use std::str::FromStr;
14
15 pub fn string_to_num<F, S: FromStr>(string: &str, msg_handler: F) -> Result<S, String>
16 where
17 F: Fn() -> String,
18 {
19 match string.parse() {
20 Ok(n) => Ok(n),
21 _ => Err(msg_handler()),
22 }
23 }
24}
25
26#[derive(Debug, PartialEq, Clone)]
27pub enum ParseToken {
28 Absolute,
30 Relative,
32 In,
34 Leaves,
36 All,
38
39 Key(String),
40 Keys(Vec<String>),
41 Array,
43 ArrayEof,
45 Filter(FilterToken),
47 Range(Option<isize>, Option<isize>, Option<usize>),
49 Union(Vec<isize>),
51
52 Number(f64),
53
54 Bool(bool),
55
56 Eof,
57}
58
59#[derive(Debug, PartialEq, Clone)]
60pub enum FilterToken {
61 Equal,
62 NotEqual,
63 Little,
64 LittleOrEqual,
65 Greater,
66 GreaterOrEqual,
67 And,
68 Or,
69}
70
71#[derive(Debug, Clone)]
72pub struct Node {
73 left: Option<Box<Node>>,
74 right: Option<Box<Node>>,
75 token: ParseToken,
76}
77
78pub struct Parser;
79
80impl Parser {
81 pub fn compile(input: &str) -> ParseResult<Node> {
82 let mut tokenizer = TokenReader::new(input);
83 Ok(Self::json_path(&mut tokenizer)?)
84 }
85
86 fn json_path(tokenizer: &mut TokenReader) -> ParseResult<Node> {
87 debug!("#json_path");
88 match tokenizer.next_token() {
89 Ok(Token::Absolute(_)) => {
90 let node = Self::node(ParseToken::Absolute);
91 Self::paths(node, tokenizer)
92 }
93 _ => Err(tokenizer.err_msg()),
94 }
95 }
96
97 fn paths(prev: Node, tokenizer: &mut TokenReader) -> ParseResult<Node> {
98 debug!("#paths");
99 match tokenizer.peek_token() {
100 Ok(Token::Dot(_)) => {
101 Self::eat_token(tokenizer);
102 Self::paths_dot(prev, tokenizer)
103 }
104 Ok(Token::OpenArray(_)) => {
105 Self::eat_token(tokenizer);
106 Self::eat_whitespace(tokenizer);
107 let node = Self::array(prev, tokenizer)?;
108 Self::paths(node, tokenizer)
109 }
110 _ => Ok(prev),
111 }
112 }
113
114 fn paths_dot(prev: Node, tokenizer: &mut TokenReader) -> ParseResult<Node> {
115 debug!("#paths_dot");
116 let node = Self::path(prev, tokenizer)?;
117 Self::paths(node, tokenizer)
118 }
119
120 fn path(prev: Node, tokenizer: &mut TokenReader) -> ParseResult<Node> {
121 debug!("#path");
122 match tokenizer.peek_token() {
123 Ok(Token::Dot(_)) => Self::path_leaves(prev, tokenizer),
124 Ok(Token::Asterisk(_)) => Self::path_in_all(prev, tokenizer),
125 Ok(Token::Key(_, _)) => Self::path_in_key(prev, tokenizer),
126 Ok(Token::OpenArray(_)) => {
127 Self::eat_token(tokenizer);
128 Self::array(prev, tokenizer)
129 }
130 _ => Err(tokenizer.err_msg()),
131 }
132 }
133
134 fn path_leaves(prev: Node, tokenizer: &mut TokenReader) -> ParseResult<Node> {
135 debug!("#path_leaves");
136 Self::eat_token(tokenizer);
137 match tokenizer.peek_token() {
138 Ok(Token::Asterisk(_)) => Self::path_leaves_all(prev, tokenizer),
139 Ok(Token::OpenArray(_)) => {
140 let mut leaves_node = Self::node(ParseToken::Leaves);
141 leaves_node.left = Some(Box::new(prev));
142 Ok(Self::paths(leaves_node, tokenizer)?)
143 }
144 _ => Self::path_leaves_key(prev, tokenizer),
145 }
146 }
147
148 fn path_leaves_key(prev: Node, tokenizer: &mut TokenReader) -> ParseResult<Node> {
149 debug!("#path_leaves_key");
150 Ok(Node {
151 token: ParseToken::Leaves,
152 left: Some(Box::new(prev)),
153 right: Some(Box::new(Self::key(tokenizer)?)),
154 })
155 }
156
157 fn path_leaves_all(prev: Node, tokenizer: &mut TokenReader) -> ParseResult<Node> {
158 debug!("#path_leaves_all");
159 Self::eat_token(tokenizer);
160 Ok(Node {
161 token: ParseToken::Leaves,
162 left: Some(Box::new(prev)),
163 right: Some(Box::new(Self::node(ParseToken::All))),
164 })
165 }
166
167 fn path_in_all(prev: Node, tokenizer: &mut TokenReader) -> ParseResult<Node> {
168 debug!("#path_in_all");
169 Self::eat_token(tokenizer);
170 Ok(Node {
171 token: ParseToken::In,
172 left: Some(Box::new(prev)),
173 right: Some(Box::new(Self::node(ParseToken::All))),
174 })
175 }
176
177 fn path_in_key(prev: Node, tokenizer: &mut TokenReader) -> ParseResult<Node> {
178 debug!("#path_in_key");
179 Ok(Node {
180 token: ParseToken::In,
181 left: Some(Box::new(prev)),
182 right: Some(Box::new(Self::key(tokenizer)?)),
183 })
184 }
185
186 fn key(tokenizer: &mut TokenReader) -> ParseResult<Node> {
187 debug!("#key");
188 match tokenizer.next_token() {
189 Ok(Token::Key(_, v)) => Ok(Self::node(ParseToken::Key(v))),
190 _ => Err(tokenizer.err_msg()),
191 }
192 }
193
194 fn boolean(tokenizer: &mut TokenReader) -> ParseResult<Node> {
195 debug!("#boolean");
196
197 fn validation_bool_value(v: &str) -> bool {
198 let b = v.as_bytes();
199 !b.is_empty() && (b[0] == b't' || b[0] == b'T' || b[0] == b'f' || b[0] == b'F')
200 }
201
202 match tokenizer.next_token() {
203 Ok(Token::Key(_, ref v)) if validation_bool_value(v) => {
204 Ok(Self::node(ParseToken::Bool(v.eq_ignore_ascii_case("true"))))
205 }
206 _ => Err(tokenizer.err_msg()),
207 }
208 }
209
210 fn array_keys(tokenizer: &mut TokenReader, first_key: String) -> ParseResult<Node> {
211 let mut keys = vec![first_key];
212
213 while let Ok(Token::Comma(_)) = tokenizer.peek_token() {
214 Self::eat_token(tokenizer);
215 Self::eat_whitespace(tokenizer);
216
217 match tokenizer.next_token() {
218 Ok(Token::SingleQuoted(_, val)) | Ok(Token::DoubleQuoted(_, val)) => {
219 keys.push(val);
220 }
221 _ => return Err(tokenizer.err_msg()),
222 }
223
224 Self::eat_whitespace(tokenizer);
225 }
226
227 Ok(Self::node(ParseToken::Keys(keys)))
228 }
229
230 fn array_quote_value(tokenizer: &mut TokenReader) -> ParseResult<Node> {
231 debug!("#array_quote_value");
232 match tokenizer.next_token() {
233 Ok(Token::SingleQuoted(_, val)) | Ok(Token::DoubleQuoted(_, val)) => {
234 if let Ok(Token::Comma(_)) = tokenizer.peek_token() {
235 Self::array_keys(tokenizer, val)
236 } else {
237 Ok(Self::node(ParseToken::Key(val)))
238 }
239 }
240 _ => Err(tokenizer.err_msg()),
241 }
242 }
243
244 fn array_start(prev: Node, tokenizer: &mut TokenReader) -> ParseResult<Node> {
245 debug!("#array_start");
246 match tokenizer.peek_token() {
247 Ok(Token::Question(_)) => {
248 Self::eat_token(tokenizer);
249 Ok(Node {
250 token: ParseToken::Array,
251 left: Some(Box::new(prev)),
252 right: Some(Box::new(Self::filter(tokenizer)?)),
253 })
254 }
255 Ok(Token::Asterisk(_)) => {
256 Self::eat_token(tokenizer);
257 Ok(Node {
258 token: ParseToken::Array,
259 left: Some(Box::new(prev)),
260 right: Some(Box::new(Self::node(ParseToken::All))),
261 })
262 }
263 _ => Ok(Node {
264 token: ParseToken::Array,
265 left: Some(Box::new(prev)),
266 right: Some(Box::new(Self::array_value(tokenizer)?)),
267 }),
268 }
269 }
270
271 fn array(prev: Node, tokenizer: &mut TokenReader) -> ParseResult<Node> {
272 debug!("#array");
273 let ret = Self::array_start(prev, tokenizer)?;
274 Self::eat_whitespace(tokenizer);
275 Self::close_token(ret, Token::CloseArray(DUMMY), tokenizer)
276 }
277
278 fn array_value_key(tokenizer: &mut TokenReader) -> ParseResult<Node> {
279 debug!("#array_value_key");
280 match tokenizer.next_token() {
281 Ok(Token::Key(pos, ref val)) => {
282 let digit = utils::string_to_num(val, || tokenizer.err_msg_with_pos(pos))?;
283 Self::eat_whitespace(tokenizer);
284
285 match tokenizer.peek_token() {
286 Ok(Token::Comma(_)) => Self::union(digit, tokenizer),
287 Ok(Token::Split(_)) => Self::range_from(digit, tokenizer),
288 _ => Ok(Self::node(ParseToken::Number(digit as f64))),
289 }
290 }
291 _ => Err(tokenizer.err_msg()),
292 }
293 }
294
295 fn array_value(tokenizer: &mut TokenReader) -> ParseResult<Node> {
296 debug!("#array_value");
297 match tokenizer.peek_token() {
298 Ok(Token::Key(_, _)) => Self::array_value_key(tokenizer),
299 Ok(Token::Split(_)) => {
300 Self::eat_token(tokenizer);
301 Self::range_to(tokenizer)
302 }
303 Ok(Token::DoubleQuoted(_, _)) | Ok(Token::SingleQuoted(_, _)) => {
304 Self::array_quote_value(tokenizer)
305 }
306 Err(TokenError::Eof) => Ok(Self::node(ParseToken::Eof)),
307 _ => {
308 Self::eat_token(tokenizer);
309 Err(tokenizer.err_msg())
310 }
311 }
312 }
313
314 fn union(num: isize, tokenizer: &mut TokenReader) -> ParseResult<Node> {
315 debug!("#union");
316 let mut values = vec![num];
317 while match tokenizer.peek_token() {
318 Ok(Token::Comma(_)) => true,
319 _ => false,
320 } {
321 Self::eat_token(tokenizer);
322 Self::eat_whitespace(tokenizer);
323 match tokenizer.next_token() {
324 Ok(Token::Key(pos, ref val)) => {
325 let digit = utils::string_to_num(val, || tokenizer.err_msg_with_pos(pos))?;
326 values.push(digit);
327 }
328 _ => {
329 return Err(tokenizer.err_msg());
330 }
331 }
332 }
333 Ok(Self::node(ParseToken::Union(values)))
334 }
335
336 fn range_value<S: FromStr>(tokenizer: &mut TokenReader) -> Result<Option<S>, String> {
337 Self::eat_whitespace(tokenizer);
338
339 match tokenizer.peek_token() {
340 Ok(Token::Split(_)) => {
341 Self::eat_token(tokenizer);
342 Self::eat_whitespace(tokenizer);
343 }
344 _ => {
345 return Ok(None);
346 }
347 }
348
349 match tokenizer.peek_token() {
350 Ok(Token::Key(_, _)) => {}
351 _ => {
352 return Ok(None);
353 }
354 }
355
356 match tokenizer.next_token() {
357 Ok(Token::Key(pos, str_step)) => {
358 match utils::string_to_num(&str_step, || tokenizer.err_msg_with_pos(pos)) {
359 Ok(step) => Ok(Some(step)),
360 Err(e) => Err(e),
361 }
362 }
363 _ => {
364 unreachable!();
365 }
366 }
367 }
368
369 fn range_from(from: isize, tokenizer: &mut TokenReader) -> ParseResult<Node> {
370 debug!("#range_from");
371 Self::eat_token(tokenizer);
372 Self::eat_whitespace(tokenizer);
373
374 match tokenizer.peek_token() {
375 Ok(Token::Key(_, _)) => Self::range(from, tokenizer),
376 Ok(Token::Split(_)) => match Self::range_value(tokenizer)? {
377 Some(step) => Ok(Self::node(ParseToken::Range(Some(from), None, Some(step)))),
378 _ => Ok(Self::node(ParseToken::Range(Some(from), None, None))),
379 },
380 _ => Ok(Self::node(ParseToken::Range(Some(from), None, None))),
381 }
382 }
383
384 fn range_to(tokenizer: &mut TokenReader) -> ParseResult<Node> {
385 debug!("#range_to");
386
387 if let Some(step) = Self::range_value(tokenizer)? {
388 return Ok(Self::node(ParseToken::Range(None, None, Some(step))));
389 }
390
391 if let Ok(Token::CloseArray(_)) = tokenizer.peek_token() {
392 return Ok(Self::node(ParseToken::Range(None, None, None)));
393 }
394
395 match tokenizer.next_token() {
396 Ok(Token::Key(pos, ref to_str)) => {
397 let to = utils::string_to_num(to_str, || tokenizer.err_msg_with_pos(pos))?;
398 let step = Self::range_value(tokenizer)?;
399 Ok(Self::node(ParseToken::Range(None, Some(to), step)))
400 }
401 _ => Err(tokenizer.err_msg()),
402 }
403 }
404
405 fn range(from: isize, tokenizer: &mut TokenReader) -> ParseResult<Node> {
406 debug!("#range");
407 match tokenizer.next_token() {
408 Ok(Token::Key(pos, ref str_to)) => {
409 let to = utils::string_to_num(str_to, || tokenizer.err_msg_with_pos(pos))?;
410 let step = Self::range_value(tokenizer)?;
411 Ok(Self::node(ParseToken::Range(Some(from), Some(to), step)))
412 }
413 _ => Err(tokenizer.err_msg()),
414 }
415 }
416
417 fn filter(tokenizer: &mut TokenReader) -> ParseResult<Node> {
418 debug!("#filter");
419 match tokenizer.next_token() {
420 Ok(Token::OpenParenthesis(_)) => {
421 let ret = Self::exprs(tokenizer)?;
422 Self::eat_whitespace(tokenizer);
423 Self::close_token(ret, Token::CloseParenthesis(DUMMY), tokenizer)
424 }
425 _ => Err(tokenizer.err_msg()),
426 }
427 }
428
429 fn exprs(tokenizer: &mut TokenReader) -> ParseResult<Node> {
430 Self::eat_whitespace(tokenizer);
431 debug!("#exprs");
432 let node = match tokenizer.peek_token() {
433 Ok(Token::OpenParenthesis(_)) => {
434 Self::eat_token(tokenizer);
435 trace!("\t-exprs - open_parenthesis");
436 let ret = Self::exprs(tokenizer)?;
437 Self::eat_whitespace(tokenizer);
438 Self::close_token(ret, Token::CloseParenthesis(DUMMY), tokenizer)?
439 }
440 _ => {
441 trace!("\t-exprs - else");
442 Self::expr(tokenizer)?
443 }
444 };
445 Self::eat_whitespace(tokenizer);
446 Self::condition_expr(node, tokenizer)
447 }
448
449 fn condition_expr(prev: Node, tokenizer: &mut TokenReader) -> ParseResult<Node> {
450 debug!("#condition_expr");
451 match tokenizer.peek_token() {
452 Ok(Token::And(_)) => {
453 Self::eat_token(tokenizer);
454 Ok(Node {
455 token: ParseToken::Filter(FilterToken::And),
456 left: Some(Box::new(prev)),
457 right: Some(Box::new(Self::exprs(tokenizer)?)),
458 })
459 }
460 Ok(Token::Or(_)) => {
461 Self::eat_token(tokenizer);
462 Ok(Node {
463 token: ParseToken::Filter(FilterToken::Or),
464 left: Some(Box::new(prev)),
465 right: Some(Box::new(Self::exprs(tokenizer)?)),
466 })
467 }
468 _ => Ok(prev),
469 }
470 }
471
472 fn expr(tokenizer: &mut TokenReader) -> ParseResult<Node> {
473 debug!("#expr");
474
475 let has_prop_candidate = match tokenizer.peek_token() {
476 Ok(Token::At(_)) => true,
477 _ => false,
478 };
479
480 let node = Self::term(tokenizer)?;
481 Self::eat_whitespace(tokenizer);
482
483 if match tokenizer.peek_token() {
484 Ok(Token::Equal(_))
485 | Ok(Token::NotEqual(_))
486 | Ok(Token::Little(_))
487 | Ok(Token::LittleOrEqual(_))
488 | Ok(Token::Greater(_))
489 | Ok(Token::GreaterOrEqual(_)) => true,
490 _ => false,
491 } {
492 Self::op(node, tokenizer)
493 } else if has_prop_candidate {
494 Ok(node)
495 } else {
496 Err(tokenizer.err_msg())
497 }
498 }
499
500 fn term_num(tokenizer: &mut TokenReader) -> ParseResult<Node> {
501 debug!("#term_num");
502 match tokenizer.next_token() {
503 Ok(Token::Key(pos, val)) => match tokenizer.peek_token() {
504 Ok(Token::Dot(_)) => Self::term_num_float(val.as_str(), tokenizer),
505 _ => {
506 let number = utils::string_to_num(&val, || tokenizer.err_msg_with_pos(pos))?;
507 Ok(Self::node(ParseToken::Number(number)))
508 }
509 },
510 _ => Err(tokenizer.err_msg()),
511 }
512 }
513
514 fn term_num_float(num: &str, tokenizer: &mut TokenReader) -> ParseResult<Node> {
515 debug!("#term_num_float");
516 Self::eat_token(tokenizer);
517 match tokenizer.next_token() {
518 Ok(Token::Key(pos, frac)) => {
519 let mut f = String::new();
520 f.push_str(&num);
521 f.push('.');
522 f.push_str(frac.as_str());
523 let number = utils::string_to_num(&f, || tokenizer.err_msg_with_pos(pos))?;
524 Ok(Self::node(ParseToken::Number(number)))
525 }
526 _ => Err(tokenizer.err_msg()),
527 }
528 }
529
530 fn term(tokenizer: &mut TokenReader) -> ParseResult<Node> {
531 debug!("#term");
532
533 match tokenizer.peek_token() {
534 Ok(Token::At(_)) => {
535 Self::eat_token(tokenizer);
536 let node = Self::node(ParseToken::Relative);
537
538 match tokenizer.peek_token() {
539 Ok(Token::Whitespace(_, _)) => {
540 Self::eat_whitespace(tokenizer);
541 Ok(node)
542 }
543 _ => Self::paths(node, tokenizer),
544 }
545 }
546 Ok(Token::Absolute(_)) => Self::json_path(tokenizer),
547 Ok(Token::DoubleQuoted(_, _)) | Ok(Token::SingleQuoted(_, _)) => {
548 Self::array_quote_value(tokenizer)
549 }
550 Ok(Token::Key(_, key)) => match key.as_bytes()[0] {
551 b'-' | b'0'..=b'9' => Self::term_num(tokenizer),
552 _ => Self::boolean(tokenizer),
553 },
554 _ => Err(tokenizer.err_msg()),
555 }
556 }
557
558 fn op(prev: Node, tokenizer: &mut TokenReader) -> ParseResult<Node> {
559 debug!("#op");
560 let token = match tokenizer.next_token() {
561 Ok(Token::Equal(_)) => ParseToken::Filter(FilterToken::Equal),
562 Ok(Token::NotEqual(_)) => ParseToken::Filter(FilterToken::NotEqual),
563 Ok(Token::Little(_)) => ParseToken::Filter(FilterToken::Little),
564 Ok(Token::LittleOrEqual(_)) => ParseToken::Filter(FilterToken::LittleOrEqual),
565 Ok(Token::Greater(_)) => ParseToken::Filter(FilterToken::Greater),
566 Ok(Token::GreaterOrEqual(_)) => ParseToken::Filter(FilterToken::GreaterOrEqual),
567 _ => {
568 return Err(tokenizer.err_msg());
569 }
570 };
571
572 Self::eat_whitespace(tokenizer);
573
574 Ok(Node {
575 token,
576 left: Some(Box::new(prev)),
577 right: Some(Box::new(Self::term(tokenizer)?)),
578 })
579 }
580
581 fn eat_whitespace(tokenizer: &mut TokenReader) {
582 while let Ok(Token::Whitespace(_, _)) = tokenizer.peek_token() {
583 let _ = tokenizer.next_token();
584 }
585 }
586
587 fn eat_token(tokenizer: &mut TokenReader) {
588 let _ = tokenizer.next_token();
589 }
590
591 fn node(token: ParseToken) -> Node {
592 Node {
593 left: None,
594 right: None,
595 token,
596 }
597 }
598
599 fn close_token(ret: Node, token: Token, tokenizer: &mut TokenReader) -> ParseResult<Node> {
600 debug!("#close_token");
601 match tokenizer.next_token() {
602 Ok(ref t) if t.is_match_token_type(token) => Ok(ret),
603 _ => Err(tokenizer.err_msg()),
604 }
605 }
606}
607
608pub trait NodeVisitor {
609 fn visit(&mut self, node: &Node) {
610 match &node.token {
611 ParseToken::Absolute
612 | ParseToken::Relative
613 | ParseToken::All
614 | ParseToken::Key(_)
615 | ParseToken::Keys(_)
616 | ParseToken::Range(_, _, _)
617 | ParseToken::Union(_)
618 | ParseToken::Number(_)
619 | ParseToken::Bool(_) => {
620 self.visit_token(&node.token);
621 }
622 ParseToken::In | ParseToken::Leaves => {
623 if let Some(n) = &node.left {
624 self.visit(&*n);
625 }
626
627 self.visit_token(&node.token);
628
629 if let Some(n) = &node.right {
630 self.visit(&*n);
631 }
632 }
633 ParseToken::Array => {
634 if let Some(n) = &node.left {
635 self.visit(&*n);
636 }
637
638 self.visit_token(&node.token);
639
640 if let Some(n) = &node.right {
641 self.visit(&*n);
642 }
643
644 self.visit_token(&ParseToken::ArrayEof);
645 }
646 ParseToken::Filter(FilterToken::And) | ParseToken::Filter(FilterToken::Or) => {
647 if let Some(n) = &node.left {
648 self.visit(&*n);
649 }
650
651 if let Some(n) = &node.right {
652 self.visit(&*n);
653 }
654
655 self.visit_token(&node.token);
656 }
657 ParseToken::Filter(_) => {
658 if let Some(n) = &node.left {
659 self.visit(&*n);
660 }
661
662 self.end_term();
663
664 if let Some(n) = &node.right {
665 self.visit(&*n);
666 }
667
668 self.end_term();
669
670 self.visit_token(&node.token);
671 }
672 _ => {}
673 }
674 }
675
676 fn visit_token(&mut self, token: &ParseToken);
677 fn end_term(&mut self) {}
678}
679
680#[cfg(test)]
681mod parser_tests {
682 use parser::{FilterToken, NodeVisitor, ParseToken, Parser};
683
684 struct NodeVisitorTestImpl<'a> {
685 input: &'a str,
686 stack: Vec<ParseToken>,
687 }
688
689 impl<'a> NodeVisitorTestImpl<'a> {
690 fn new(input: &'a str) -> Self {
691 NodeVisitorTestImpl {
692 input,
693 stack: Vec::new(),
694 }
695 }
696
697 fn start(&mut self) -> Result<Vec<ParseToken>, String> {
698 let node = Parser::compile(self.input)?;
699 self.visit(&node);
700 Ok(self.stack.split_off(0))
701 }
702 }
703
704 impl<'a> NodeVisitor for NodeVisitorTestImpl<'a> {
705 fn visit_token(&mut self, token: &ParseToken) {
706 self.stack.push(token.clone());
707 }
708 }
709
710 fn setup() {
711 let _ = env_logger::try_init();
712 }
713
714 fn run(input: &str) -> Result<Vec<ParseToken>, String> {
715 let mut interpreter = NodeVisitorTestImpl::new(input);
716 interpreter.start()
717 }
718
719 #[test]
720 fn parse_error() {
721 setup();
722
723 fn invalid(path: &str) {
724 assert!(run(path).is_err());
725 }
726
727 invalid("$[]");
728 invalid("$[a]");
729 invalid("$[?($.a)]");
730 invalid("$[?(@.a > @.b]");
731 invalid("$[?(@.a < @.b&&(@.c < @.d)]");
732 invalid("@.");
733 invalid("$..[?(a <= @.a)]"); invalid("$['a', b]");
735 invalid("$[0, >=]");
736 invalid("$[a:]");
737 invalid("$[:a]");
738 invalid("$[::a]");
739 invalid("$[:>]");
740 invalid("$[1:>]");
741 invalid("$[1,,]");
742 invalid("$[?]");
743 invalid("$[?(1 = 1)]");
744 invalid("$[?(1 = >)]");
745 }
746
747 #[test]
748 fn parse_path() {
749 setup();
750
751 assert_eq!(
752 run("$.aa"),
753 Ok(vec![
754 ParseToken::Absolute,
755 ParseToken::In,
756 ParseToken::Key("aa".to_owned())
757 ])
758 );
759
760 assert_eq!(
761 run("$.00.a"),
762 Ok(vec![
763 ParseToken::Absolute,
764 ParseToken::In,
765 ParseToken::Key("00".to_owned()),
766 ParseToken::In,
767 ParseToken::Key("a".to_owned())
768 ])
769 );
770
771 assert_eq!(
772 run("$.00.韓창.seok"),
773 Ok(vec![
774 ParseToken::Absolute,
775 ParseToken::In,
776 ParseToken::Key("00".to_owned()),
777 ParseToken::In,
778 ParseToken::Key("韓창".to_owned()),
779 ParseToken::In,
780 ParseToken::Key("seok".to_owned())
781 ])
782 );
783
784 assert_eq!(
785 run("$.*"),
786 Ok(vec![ParseToken::Absolute, ParseToken::In, ParseToken::All])
787 );
788
789 assert_eq!(
790 run("$..*"),
791 Ok(vec![
792 ParseToken::Absolute,
793 ParseToken::Leaves,
794 ParseToken::All
795 ])
796 );
797
798 assert_eq!(
799 run("$..[0]"),
800 Ok(vec![
801 ParseToken::Absolute,
802 ParseToken::Leaves,
803 ParseToken::Array,
804 ParseToken::Number(0.0),
805 ParseToken::ArrayEof
806 ])
807 );
808
809 assert_eq!(
810 run("$.$a"),
811 Ok(vec![
812 ParseToken::Absolute,
813 ParseToken::In,
814 ParseToken::Key("$a".to_owned())
815 ])
816 );
817
818 assert_eq!(
819 run("$.['$a']"),
820 Ok(vec![
821 ParseToken::Absolute,
822 ParseToken::Array,
823 ParseToken::Key("$a".to_owned()),
824 ParseToken::ArrayEof,
825 ])
826 );
827
828 if run("$.").is_ok() {
829 panic!();
830 }
831
832 if run("$..").is_ok() {
833 panic!();
834 }
835
836 if run("$. a").is_ok() {
837 panic!();
838 }
839 }
840
841 #[test]
842 fn parse_array_syntax() {
843 setup();
844
845 assert_eq!(
846 run("$.book[?(@.isbn)]"),
847 Ok(vec![
848 ParseToken::Absolute,
849 ParseToken::In,
850 ParseToken::Key("book".to_string()),
851 ParseToken::Array,
852 ParseToken::Relative,
853 ParseToken::In,
854 ParseToken::Key("isbn".to_string()),
855 ParseToken::ArrayEof
856 ])
857 );
858
859 assert_eq!(
863 run("$.[*]"),
864 Ok(vec![
865 ParseToken::Absolute,
866 ParseToken::Array,
867 ParseToken::All,
868 ParseToken::ArrayEof
869 ])
870 );
871
872 assert_eq!(
873 run("$.a[*]"),
874 Ok(vec![
875 ParseToken::Absolute,
876 ParseToken::In,
877 ParseToken::Key("a".to_owned()),
878 ParseToken::Array,
879 ParseToken::All,
880 ParseToken::ArrayEof
881 ])
882 );
883
884 assert_eq!(
885 run("$.a[*].가"),
886 Ok(vec![
887 ParseToken::Absolute,
888 ParseToken::In,
889 ParseToken::Key("a".to_owned()),
890 ParseToken::Array,
891 ParseToken::All,
892 ParseToken::ArrayEof,
893 ParseToken::In,
894 ParseToken::Key("가".to_owned())
895 ])
896 );
897
898 assert_eq!(
899 run("$.a[0][1]"),
900 Ok(vec![
901 ParseToken::Absolute,
902 ParseToken::In,
903 ParseToken::Key("a".to_owned()),
904 ParseToken::Array,
905 ParseToken::Number(0_f64),
906 ParseToken::ArrayEof,
907 ParseToken::Array,
908 ParseToken::Number(1_f64),
909 ParseToken::ArrayEof
910 ])
911 );
912
913 assert_eq!(
914 run("$.a[1,2]"),
915 Ok(vec![
916 ParseToken::Absolute,
917 ParseToken::In,
918 ParseToken::Key("a".to_owned()),
919 ParseToken::Array,
920 ParseToken::Union(vec![1, 2]),
921 ParseToken::ArrayEof
922 ])
923 );
924
925 assert_eq!(
926 run("$.a[10:]"),
927 Ok(vec![
928 ParseToken::Absolute,
929 ParseToken::In,
930 ParseToken::Key("a".to_owned()),
931 ParseToken::Array,
932 ParseToken::Range(Some(10), None, None),
933 ParseToken::ArrayEof
934 ])
935 );
936
937 assert_eq!(
938 run("$.a[:11]"),
939 Ok(vec![
940 ParseToken::Absolute,
941 ParseToken::In,
942 ParseToken::Key("a".to_owned()),
943 ParseToken::Array,
944 ParseToken::Range(None, Some(11), None),
945 ParseToken::ArrayEof
946 ])
947 );
948
949 assert_eq!(
950 run("$.a[-12:13]"),
951 Ok(vec![
952 ParseToken::Absolute,
953 ParseToken::In,
954 ParseToken::Key("a".to_owned()),
955 ParseToken::Array,
956 ParseToken::Range(Some(-12), Some(13), None),
957 ParseToken::ArrayEof
958 ])
959 );
960
961 assert_eq!(
962 run(r#"$[0:3:2]"#),
963 Ok(vec![
964 ParseToken::Absolute,
965 ParseToken::Array,
966 ParseToken::Range(Some(0), Some(3), Some(2)),
967 ParseToken::ArrayEof
968 ])
969 );
970
971 assert_eq!(
972 run(r#"$[:3:2]"#),
973 Ok(vec![
974 ParseToken::Absolute,
975 ParseToken::Array,
976 ParseToken::Range(None, Some(3), Some(2)),
977 ParseToken::ArrayEof
978 ])
979 );
980
981 assert_eq!(
982 run(r#"$[:]"#),
983 Ok(vec![
984 ParseToken::Absolute,
985 ParseToken::Array,
986 ParseToken::Range(None, None, None),
987 ParseToken::ArrayEof
988 ])
989 );
990
991 assert_eq!(
992 run(r#"$[::]"#),
993 Ok(vec![
994 ParseToken::Absolute,
995 ParseToken::Array,
996 ParseToken::Range(None, None, None),
997 ParseToken::ArrayEof
998 ])
999 );
1000
1001 assert_eq!(
1002 run(r#"$[::2]"#),
1003 Ok(vec![
1004 ParseToken::Absolute,
1005 ParseToken::Array,
1006 ParseToken::Range(None, None, Some(2)),
1007 ParseToken::ArrayEof
1008 ])
1009 );
1010
1011 assert_eq!(
1012 run(r#"$["a", 'b']"#),
1013 Ok(vec![
1014 ParseToken::Absolute,
1015 ParseToken::Array,
1016 ParseToken::Keys(vec!["a".to_string(), "b".to_string()]),
1017 ParseToken::ArrayEof
1018 ])
1019 );
1020
1021 assert_eq!(
1022 run("$.a[?(1>2)]"),
1023 Ok(vec![
1024 ParseToken::Absolute,
1025 ParseToken::In,
1026 ParseToken::Key("a".to_owned()),
1027 ParseToken::Array,
1028 ParseToken::Number(1_f64),
1029 ParseToken::Number(2_f64),
1030 ParseToken::Filter(FilterToken::Greater),
1031 ParseToken::ArrayEof
1032 ])
1033 );
1034
1035 assert_eq!(
1036 run("$.a[?($.b>3)]"),
1037 Ok(vec![
1038 ParseToken::Absolute,
1039 ParseToken::In,
1040 ParseToken::Key("a".to_owned()),
1041 ParseToken::Array,
1042 ParseToken::Absolute,
1043 ParseToken::In,
1044 ParseToken::Key("b".to_owned()),
1045 ParseToken::Number(3_f64),
1046 ParseToken::Filter(FilterToken::Greater),
1047 ParseToken::ArrayEof
1048 ])
1049 );
1050
1051 assert_eq!(
1052 run("$[?($.c>@.d && 1==2)]"),
1053 Ok(vec![
1054 ParseToken::Absolute,
1055 ParseToken::Array,
1056 ParseToken::Absolute,
1057 ParseToken::In,
1058 ParseToken::Key("c".to_owned()),
1059 ParseToken::Relative,
1060 ParseToken::In,
1061 ParseToken::Key("d".to_owned()),
1062 ParseToken::Filter(FilterToken::Greater),
1063 ParseToken::Number(1_f64),
1064 ParseToken::Number(2_f64),
1065 ParseToken::Filter(FilterToken::Equal),
1066 ParseToken::Filter(FilterToken::And),
1067 ParseToken::ArrayEof
1068 ])
1069 );
1070
1071 assert_eq!(
1072 run("$[?($.c>@.d&&(1==2||3>=4))]"),
1073 Ok(vec![
1074 ParseToken::Absolute,
1075 ParseToken::Array,
1076 ParseToken::Absolute,
1077 ParseToken::In,
1078 ParseToken::Key("c".to_owned()),
1079 ParseToken::Relative,
1080 ParseToken::In,
1081 ParseToken::Key("d".to_owned()),
1082 ParseToken::Filter(FilterToken::Greater),
1083 ParseToken::Number(1_f64),
1084 ParseToken::Number(2_f64),
1085 ParseToken::Filter(FilterToken::Equal),
1086 ParseToken::Number(3_f64),
1087 ParseToken::Number(4_f64),
1088 ParseToken::Filter(FilterToken::GreaterOrEqual),
1089 ParseToken::Filter(FilterToken::Or),
1090 ParseToken::Filter(FilterToken::And),
1091 ParseToken::ArrayEof
1092 ])
1093 );
1094
1095 assert_eq!(
1096 run("$[?(@.a<@.b)]"),
1097 Ok(vec![
1098 ParseToken::Absolute,
1099 ParseToken::Array,
1100 ParseToken::Relative,
1101 ParseToken::In,
1102 ParseToken::Key("a".to_owned()),
1103 ParseToken::Relative,
1104 ParseToken::In,
1105 ParseToken::Key("b".to_owned()),
1106 ParseToken::Filter(FilterToken::Little),
1107 ParseToken::ArrayEof
1108 ])
1109 );
1110
1111 assert_eq!(
1112 run("$[*][*][*]"),
1113 Ok(vec![
1114 ParseToken::Absolute,
1115 ParseToken::Array,
1116 ParseToken::All,
1117 ParseToken::ArrayEof,
1118 ParseToken::Array,
1119 ParseToken::All,
1120 ParseToken::ArrayEof,
1121 ParseToken::Array,
1122 ParseToken::All,
1123 ParseToken::ArrayEof
1124 ])
1125 );
1126
1127 assert_eq!(
1128 run("$['a']['bb']"),
1129 Ok(vec![
1130 ParseToken::Absolute,
1131 ParseToken::Array,
1132 ParseToken::Key("a".to_string()),
1133 ParseToken::ArrayEof,
1134 ParseToken::Array,
1135 ParseToken::Key("bb".to_string()),
1136 ParseToken::ArrayEof
1137 ])
1138 );
1139
1140 assert_eq!(
1141 run("$.a[?(@.e==true)]"),
1142 Ok(vec![
1143 ParseToken::Absolute,
1144 ParseToken::In,
1145 ParseToken::Key("a".to_string()),
1146 ParseToken::Array,
1147 ParseToken::Relative,
1148 ParseToken::In,
1149 ParseToken::Key("e".to_string()),
1150 ParseToken::Bool(true),
1151 ParseToken::Filter(FilterToken::Equal),
1152 ParseToken::ArrayEof
1153 ])
1154 );
1155
1156 assert_eq!(
1157 run(r#"$[?(@ > 1)]"#),
1158 Ok(vec![
1159 ParseToken::Absolute,
1160 ParseToken::Array,
1161 ParseToken::Relative,
1162 ParseToken::Number(1_f64),
1163 ParseToken::Filter(FilterToken::Greater),
1164 ParseToken::ArrayEof
1165 ])
1166 );
1167
1168 assert_eq!(
1169 run("$[:]"),
1170 Ok(vec![
1171 ParseToken::Absolute,
1172 ParseToken::Array,
1173 ParseToken::Range(None, None, None),
1174 ParseToken::ArrayEof
1175 ])
1176 );
1177
1178 assert_eq!(
1179 run(r#"$['single\'quote']"#),
1180 Ok(vec![
1181 ParseToken::Absolute,
1182 ParseToken::Array,
1183 ParseToken::Key("single'quote".to_string()),
1184 ParseToken::ArrayEof
1185 ])
1186 );
1187
1188 assert_eq!(
1189 run(r#"$["single\"quote"]"#),
1190 Ok(vec![
1191 ParseToken::Absolute,
1192 ParseToken::Array,
1193 ParseToken::Key(r#"single"quote"#.to_string()),
1194 ParseToken::ArrayEof
1195 ])
1196 );
1197 }
1198
1199 #[test]
1200 fn parse_array_float() {
1201 setup();
1202
1203 assert_eq!(
1204 run("$[?(1.1<2.1)]"),
1205 Ok(vec![
1206 ParseToken::Absolute,
1207 ParseToken::Array,
1208 ParseToken::Number(1.1),
1209 ParseToken::Number(2.1),
1210 ParseToken::Filter(FilterToken::Little),
1211 ParseToken::ArrayEof
1212 ])
1213 );
1214
1215 if run("$[1.1]").is_ok() {
1216 panic!();
1217 }
1218
1219 if run("$[?(1.1<.2)]").is_ok() {
1220 panic!();
1221 }
1222
1223 if run("$[?(1.1<2.)]").is_ok() {
1224 panic!();
1225 }
1226
1227 if run("$[?(1.1<2.a)]").is_ok() {
1228 panic!();
1229 }
1230 }
1231}
1232
1233#[cfg(test)]
1234mod tokenizer_tests {
1235 use parser::tokenizer::{Token, TokenError, TokenReader, Tokenizer};
1236
1237 fn setup() {
1238 let _ = env_logger::try_init();
1239 }
1240
1241 fn collect_token(input: &str) -> (Vec<Token>, Option<TokenError>) {
1242 let mut tokenizer = Tokenizer::new(input);
1243 let mut vec = vec![];
1244 loop {
1245 match tokenizer.next_token() {
1246 Ok(t) => vec.push(t),
1247 Err(e) => return (vec, Some(e)),
1248 }
1249 }
1250 }
1251
1252 fn run(input: &str, expected: (Vec<Token>, Option<TokenError>)) {
1253 let (vec, err) = collect_token(input);
1254 assert_eq!((vec, err), expected, "\"{}\"", input);
1255 }
1256
1257 #[test]
1258 fn peek() {
1259 let mut tokenizer = TokenReader::new("$.a");
1260 match tokenizer.next_token() {
1261 Ok(t) => assert_eq!(Token::Absolute(0), t),
1262 _ => panic!(),
1263 }
1264
1265 match tokenizer.peek_token() {
1266 Ok(t) => assert_eq!(&Token::Dot(1), t),
1267 _ => panic!(),
1268 }
1269
1270 match tokenizer.peek_token() {
1271 Ok(t) => assert_eq!(&Token::Dot(1), t),
1272 _ => panic!(),
1273 }
1274
1275 match tokenizer.next_token() {
1276 Ok(t) => assert_eq!(Token::Dot(1), t),
1277 _ => panic!(),
1278 }
1279 }
1280
1281 #[test]
1282 fn token() {
1283 setup();
1284
1285 run(
1286 "$.01.a",
1287 (
1288 vec![
1289 Token::Absolute(0),
1290 Token::Dot(1),
1291 Token::Key(2, "01".to_string()),
1292 Token::Dot(4),
1293 Token::Key(5, "a".to_string()),
1294 ],
1295 Some(TokenError::Eof),
1296 ),
1297 );
1298
1299 run(
1300 "$. []",
1301 (
1302 vec![
1303 Token::Absolute(0),
1304 Token::Dot(1),
1305 Token::Whitespace(2, 2),
1306 Token::OpenArray(5),
1307 Token::CloseArray(6),
1308 ],
1309 Some(TokenError::Eof),
1310 ),
1311 );
1312
1313 run(
1314 "$..",
1315 (
1316 vec![Token::Absolute(0), Token::Dot(1), Token::Dot(2)],
1317 Some(TokenError::Eof),
1318 ),
1319 );
1320
1321 run(
1322 "$..ab",
1323 (
1324 vec![
1325 Token::Absolute(0),
1326 Token::Dot(1),
1327 Token::Dot(2),
1328 Token::Key(3, "ab".to_string()),
1329 ],
1330 Some(TokenError::Eof),
1331 ),
1332 );
1333
1334 run(
1335 "$..가 [",
1336 (
1337 vec![
1338 Token::Absolute(0),
1339 Token::Dot(1),
1340 Token::Dot(2),
1341 Token::Key(3, "가".to_string()),
1342 Token::Whitespace(6, 0),
1343 Token::OpenArray(7),
1344 ],
1345 Some(TokenError::Eof),
1346 ),
1347 );
1348
1349 run(
1350 "[-1, 2 ]",
1351 (
1352 vec![
1353 Token::OpenArray(0),
1354 Token::Key(1, "-1".to_string()),
1355 Token::Comma(3),
1356 Token::Whitespace(4, 0),
1357 Token::Key(5, "2".to_string()),
1358 Token::Whitespace(6, 0),
1359 Token::CloseArray(7),
1360 ],
1361 Some(TokenError::Eof),
1362 ),
1363 );
1364
1365 run(
1366 "[ 1 2 , 3 \"abc\" : -10 ]",
1367 (
1368 vec![
1369 Token::OpenArray(0),
1370 Token::Whitespace(1, 0),
1371 Token::Key(2, "1".to_string()),
1372 Token::Whitespace(3, 0),
1373 Token::Key(4, "2".to_string()),
1374 Token::Whitespace(5, 0),
1375 Token::Comma(6),
1376 Token::Whitespace(7, 0),
1377 Token::Key(8, "3".to_string()),
1378 Token::Whitespace(9, 0),
1379 Token::DoubleQuoted(10, "abc".to_string()),
1380 Token::Whitespace(15, 0),
1381 Token::Split(16),
1382 Token::Whitespace(17, 0),
1383 Token::Key(18, "-10".to_string()),
1384 Token::Whitespace(21, 0),
1385 Token::CloseArray(22),
1386 ],
1387 Some(TokenError::Eof),
1388 ),
1389 );
1390
1391 run(
1392 "?(@.a가 <41.01)",
1393 (
1394 vec![
1395 Token::Question(0),
1396 Token::OpenParenthesis(1),
1397 Token::At(2),
1398 Token::Dot(3),
1399 Token::Key(4, "a가".to_string()),
1400 Token::Whitespace(8, 0),
1401 Token::Little(9),
1402 Token::Key(10, "41".to_string()),
1403 Token::Dot(12),
1404 Token::Key(13, "01".to_string()),
1405 Token::CloseParenthesis(15),
1406 ],
1407 Some(TokenError::Eof),
1408 ),
1409 );
1410
1411 run(
1412 "?(@.a <4a.01)",
1413 (
1414 vec![
1415 Token::Question(0),
1416 Token::OpenParenthesis(1),
1417 Token::At(2),
1418 Token::Dot(3),
1419 Token::Key(4, "a".to_string()),
1420 Token::Whitespace(5, 0),
1421 Token::Little(6),
1422 Token::Key(7, "4a".to_string()),
1423 Token::Dot(9),
1424 Token::Key(10, "01".to_string()),
1425 Token::CloseParenthesis(12),
1426 ],
1427 Some(TokenError::Eof),
1428 ),
1429 );
1430
1431 run(
1432 "?($.c>@.d)",
1433 (
1434 vec![
1435 Token::Question(0),
1436 Token::OpenParenthesis(1),
1437 Token::Absolute(2),
1438 Token::Dot(3),
1439 Token::Key(4, "c".to_string()),
1440 Token::Greater(5),
1441 Token::At(6),
1442 Token::Dot(7),
1443 Token::Key(8, "d".to_string()),
1444 Token::CloseParenthesis(9),
1445 ],
1446 Some(TokenError::Eof),
1447 ),
1448 );
1449
1450 run(
1451 "$[:]",
1452 (
1453 vec![
1454 Token::Absolute(0),
1455 Token::OpenArray(1),
1456 Token::Split(2),
1457 Token::CloseArray(3),
1458 ],
1459 Some(TokenError::Eof),
1460 ),
1461 );
1462
1463 run(
1464 r#"$['single\'quote']"#,
1465 (
1466 vec![
1467 Token::Absolute(0),
1468 Token::OpenArray(1),
1469 Token::SingleQuoted(2, "single\'quote".to_string()),
1470 Token::CloseArray(17),
1471 ],
1472 Some(TokenError::Eof),
1473 ),
1474 );
1475
1476 run(
1477 r#"$['single\'1','single\'2']"#,
1478 (
1479 vec![
1480 Token::Absolute(0),
1481 Token::OpenArray(1),
1482 Token::SingleQuoted(2, "single\'1".to_string()),
1483 Token::Comma(13),
1484 Token::SingleQuoted(14, "single\'2".to_string()),
1485 Token::CloseArray(25),
1486 ],
1487 Some(TokenError::Eof),
1488 ),
1489 );
1490
1491 run(
1492 r#"$["double\"quote"]"#,
1493 (
1494 vec![
1495 Token::Absolute(0),
1496 Token::OpenArray(1),
1497 Token::DoubleQuoted(2, "double\"quote".to_string()),
1498 Token::CloseArray(17),
1499 ],
1500 Some(TokenError::Eof),
1501 ),
1502 );
1503 }
1504}