1use std::str::FromStr;
2
3use crate::{debug, trace};
4
5use super::parser_node_visitor::ParserNodeVisitor;
6use super::parser_token_handler::ParserTokenHandler;
7use super::str_reader::StrRange;
8use super::tokenizer::{TokenError, TokenReader};
9use super::tokens::{FilterToken, ParseToken, Token};
10
11#[derive(Clone, Debug)]
12pub struct PathParser<'a> {
13 parser: ParserImpl<'a>,
14}
15
16impl<'a> PathParser<'a> {
17 pub fn compile(input: &'a str) -> Result<Self, TokenError> {
18 let mut parser = ParserImpl::new(input);
19 parser.compile()?;
20 Ok(PathParser { parser })
21 }
22
23 pub(crate) fn parse<F>(&self, parse_token_handler: &mut F) -> Result<(), String>
24 where
25 F: ParserTokenHandler<'a>,
26 {
27 if self.parser.parse_node.is_none() {
28 unreachable!()
29 }
30
31 let token_reader = &self.parser.token_reader;
32 if let Some(parse_node) = self.parser.parse_node.as_ref() {
33 self.visit(parse_node, parse_token_handler, &|s| {
34 token_reader.read_value(s)
35 });
36 }
37
38 Ok(())
39 }
40}
41
42impl<'a> ParserNodeVisitor<'a> for PathParser<'a> {}
43
44#[derive(Clone, Debug)]
45struct ParserImpl<'a> {
46 token_reader: TokenReader<'a>,
47 parse_node: Option<ParserNode>,
48}
49
50impl<'a> ParserImpl<'a> {
51 pub fn new(input: &'a str) -> Self {
52 ParserImpl {
53 token_reader: TokenReader::new(input),
54 parse_node: None,
55 }
56 }
57
58 fn string_to_num<F, S: FromStr>(string: &str, msg_handler: F) -> Result<S, TokenError>
59 where
60 F: Fn() -> TokenError,
61 {
62 match string.parse() {
63 Ok(n) => Ok(n),
64 _ => Err(msg_handler()),
65 }
66 }
67
68 pub fn compile(&mut self) -> Result<&mut Self, TokenError> {
69 self.parse_node = Some(self.json_path()?);
70 Ok(self)
71 }
72
73 fn json_path(&mut self) -> Result<ParserNode, TokenError> {
74 debug!("#json_path");
75 match self.token_reader.next_token() {
76 Ok(Token::Absolute(_)) => {
77 let node = self.create_node(ParseToken::Absolute);
78 self.paths(node)
79 }
80 _ => Err(self.token_reader.to_error()),
81 }
82 }
83
84 fn paths(&mut self, prev: ParserNode) -> Result<ParserNode, TokenError> {
85 debug!("#paths");
86 match self.token_reader.peek_token() {
87 Ok(Token::Dot(_)) => {
88 self.eat_token();
89 self.paths_dot(prev)
90 }
91 Ok(Token::OpenArray(_)) => {
92 self.eat_token();
93 self.eat_whitespace();
94 let node = self.array(prev)?;
95 self.paths(node)
96 }
97 _ => Ok(prev),
98 }
99 }
100
101 fn paths_dot(&mut self, prev: ParserNode) -> Result<ParserNode, TokenError> {
102 debug!("#paths_dot");
103 let node = self.path(prev)?;
104 self.paths(node)
105 }
106
107 fn path(&mut self, prev: ParserNode) -> Result<ParserNode, TokenError> {
108 debug!("#path");
109 match self.token_reader.peek_token() {
110 Ok(Token::Dot(_)) => self.path_leaves(prev),
111 Ok(Token::Asterisk(_)) => self.path_in_all(prev),
112 Ok(Token::Key(_)) => self.path_in_key(prev),
113 Ok(Token::OpenArray(_)) => {
114 self.eat_token();
115 self.array(prev)
116 }
117 _ => Err(self.token_reader.to_error()),
118 }
119 }
120
121 fn path_leaves(&mut self, prev: ParserNode) -> Result<ParserNode, TokenError> {
122 debug!("#path_leaves");
123 self.eat_token();
124 match self.token_reader.peek_token() {
125 Ok(Token::Asterisk(_)) => self.path_leaves_all(prev),
126 Ok(Token::OpenArray(_)) => {
127 let mut leaves_node = self.create_node(ParseToken::Leaves);
128 leaves_node.left = Some(Box::new(prev));
129 Ok(self.paths(leaves_node)?)
130 }
131 _ => self.path_leaves_key(prev),
132 }
133 }
134
135 fn path_leaves_key(&mut self, prev: ParserNode) -> Result<ParserNode, TokenError> {
136 debug!("#path_leaves_key");
137 Ok(ParserNode {
138 token: ParseToken::Leaves,
139 left: Some(Box::new(prev)),
140 right: Some(Box::new(self.key()?)),
141 })
142 }
143
144 fn path_leaves_all(&mut self, prev: ParserNode) -> Result<ParserNode, TokenError> {
145 debug!("#path_leaves_all");
146 self.eat_token();
147 Ok(ParserNode {
148 token: ParseToken::Leaves,
149 left: Some(Box::new(prev)),
150 right: Some(Box::new(self.create_node(ParseToken::All))),
151 })
152 }
153
154 fn path_in_all(&mut self, prev: ParserNode) -> Result<ParserNode, TokenError> {
155 debug!("#path_in_all");
156 self.eat_token();
157 Ok(ParserNode {
158 token: ParseToken::In,
159 left: Some(Box::new(prev)),
160 right: Some(Box::new(self.create_node(ParseToken::All))),
161 })
162 }
163
164 fn path_in_key(&mut self, prev: ParserNode) -> Result<ParserNode, TokenError> {
165 debug!("#path_in_key");
166 Ok(ParserNode {
167 token: ParseToken::In,
168 left: Some(Box::new(prev)),
169 right: Some(Box::new(self.key()?)),
170 })
171 }
172
173 fn key(&mut self) -> Result<ParserNode, TokenError> {
174 debug!("#key");
175 match self.token_reader.next_token() {
176 Ok(Token::Key(s)) => Ok(self.create_node(ParseToken::Key(s))),
177 _ => Err(self.token_reader.to_error()),
178 }
179 }
180
181 fn boolean(&mut self) -> Result<ParserNode, TokenError> {
182 debug!("#boolean");
183
184 fn validation_bool_value(v: &str) -> bool {
185 let b = v.as_bytes();
186 !b.is_empty() && (b[0] == b't' || b[0] == b'T' || b[0] == b'f' || b[0] == b'F')
187 }
188
189 if let Ok(Token::Key(s)) = self.token_reader.next_token() {
190 let v = self.token_reader.read_value(&s);
191 if validation_bool_value(v) {
192 return Ok(self.create_node(ParseToken::Bool(v.eq_ignore_ascii_case("true"))));
193 }
194 }
195
196 Err(self.token_reader.to_error())
197 }
198
199 fn array_keys(&mut self, first_key: StrRange) -> Result<ParserNode, TokenError> {
200 let mut keys = vec![first_key];
201
202 while let Ok(Token::Comma(_)) = self.token_reader.peek_token() {
203 self.eat_token();
204 self.eat_whitespace();
205
206 match self.token_reader.next_token() {
207 Ok(Token::SingleQuoted(s)) | Ok(Token::DoubleQuoted(s)) => {
208 keys.push(s);
209 }
210 _ => return Err(self.token_reader.to_error()),
211 }
212
213 self.eat_whitespace();
214 }
215
216 Ok(self.create_node(ParseToken::Keys(keys)))
217 }
218
219 fn array_quote_value(&mut self) -> Result<ParserNode, TokenError> {
220 debug!("#array_quote_value");
221 let next = self.token_reader.next_token();
222 match next {
223 Ok(Token::SingleQuoted(s)) | Ok(Token::DoubleQuoted(s)) => {
224 if let Ok(Token::Comma(_)) = self.token_reader.peek_token() {
225 self.array_keys(s)
226 } else {
227 Ok(self.create_node(ParseToken::Key(s)))
228 }
229 }
230 _ => Err(self.token_reader.to_error()),
231 }
232 }
233
234 fn array_start(&mut self, prev: ParserNode) -> Result<ParserNode, TokenError> {
235 debug!("#array_start");
236 match self.token_reader.peek_token() {
237 Ok(Token::Question(_)) => {
238 self.eat_token();
239 Ok(ParserNode {
240 token: ParseToken::Array,
241 left: Some(Box::new(prev)),
242 right: Some(Box::new(self.filter()?)),
243 })
244 }
245 Ok(Token::Asterisk(_)) => {
246 self.eat_token();
247 Ok(ParserNode {
248 token: ParseToken::Array,
249 left: Some(Box::new(prev)),
250 right: Some(Box::new(self.create_node(ParseToken::All))),
251 })
252 }
253 _ => Ok(ParserNode {
254 token: ParseToken::Array,
255 left: Some(Box::new(prev)),
256 right: Some(Box::new(self.array_value()?)),
257 }),
258 }
259 }
260
261 fn array(&mut self, prev: ParserNode) -> Result<ParserNode, TokenError> {
262 debug!("#array");
263 let ret = self.array_start(prev)?;
264 self.eat_whitespace();
265 self.close_token(ret, Token::CloseArray(StrRange::new(0, 0)))
266 }
267
268 fn array_value_key(&mut self) -> Result<ParserNode, TokenError> {
269 debug!("#array_value_key");
270
271 if let Ok(Token::Key(s)) = self.token_reader.next_token() {
272 let val = self.token_reader.read_value(&s);
273 let digit = Self::string_to_num(val, || self.token_reader.to_error())?;
274 self.eat_whitespace();
275
276 match self.token_reader.peek_token() {
277 Ok(Token::Comma(_)) => self.union(digit),
278 Ok(Token::Split(_)) => self.range_from(digit),
279 _ => Ok(self.create_node(ParseToken::Number(digit as f64))),
280 }
281 } else {
282 Err(self.token_reader.to_error())
283 }
284 }
285
286 fn array_value(&mut self) -> Result<ParserNode, TokenError> {
287 debug!("#array_value");
288 match self.token_reader.peek_token() {
289 Ok(Token::Key(_)) => self.array_value_key(),
290 Ok(Token::Split(_)) => {
291 self.eat_token();
292 self.range_to()
293 }
294 Ok(Token::DoubleQuoted(_)) | Ok(Token::SingleQuoted(_)) => self.array_quote_value(),
295 Err(TokenError::Eof) => Ok(self.create_node(ParseToken::Eof)),
296 _ => {
297 self.eat_token();
298 Err(self.token_reader.to_error())
299 }
300 }
301 }
302
303 fn union(&mut self, num: isize) -> Result<ParserNode, TokenError> {
304 debug!("#union");
305 let mut values = vec![num];
306 while matches!(self.token_reader.peek_token(), Ok(Token::Comma(_))) {
307 self.eat_token();
308 self.eat_whitespace();
309
310 match self.token_reader.next_token() {
311 Ok(Token::Key(s)) => {
312 let val = self.token_reader.read_value(&s);
313 let digit = Self::string_to_num(val, || self.token_reader.to_error())?;
314 values.push(digit);
315 }
316 _ => {
317 return Err(self.token_reader.to_error());
318 }
319 }
320 }
321 Ok(self.create_node(ParseToken::Union(values)))
322 }
323
324 fn range_value<S: FromStr>(&mut self) -> Result<Option<S>, TokenError> {
325 self.eat_whitespace();
326
327 match self.token_reader.peek_token() {
328 Ok(Token::Split(_)) => {
329 self.eat_token();
330 self.eat_whitespace();
331 }
332 _ => {
333 return Ok(None);
334 }
335 }
336
337 match self.token_reader.peek_token() {
338 Ok(Token::Key(_)) => {}
339 _ => {
340 return Ok(None);
341 }
342 }
343
344 match self.token_reader.next_token() {
345 Ok(Token::Key(s)) => {
346 let str_step = self.token_reader.read_value(&s);
347 match Self::string_to_num(str_step, || self.token_reader.to_error()) {
348 Ok(step) => Ok(Some(step)),
349 Err(e) => Err(e),
350 }
351 }
352 _ => {
353 unreachable!();
354 }
355 }
356 }
357
358 fn range_from(&mut self, from: isize) -> Result<ParserNode, TokenError> {
359 debug!("#range_from");
360 self.eat_token();
361 self.eat_whitespace();
362
363 match self.token_reader.peek_token() {
364 Ok(Token::Key(_)) => self.range(from),
365 Ok(Token::Split(_)) => match self.range_value()? {
366 Some(step) => Ok(self.create_node(ParseToken::Range(Some(from), None, Some(step)))),
367 _ => Ok(self.create_node(ParseToken::Range(Some(from), None, None))),
368 },
369 _ => Ok(self.create_node(ParseToken::Range(Some(from), None, None))),
370 }
371 }
372
373 fn range_to(&mut self) -> Result<ParserNode, TokenError> {
374 debug!("#range_to");
375
376 if let Some(step) = self.range_value()? {
377 return Ok(self.create_node(ParseToken::Range(None, None, Some(step))));
378 }
379
380 if let Ok(Token::CloseArray(_)) = self.token_reader.peek_token() {
381 return Ok(self.create_node(ParseToken::Range(None, None, None)));
382 }
383
384 match self.token_reader.next_token() {
385 Ok(Token::Key(s)) => {
386 let to_str = self.token_reader.read_value(&s);
387 let to = Self::string_to_num(to_str, || self.token_reader.to_error())?;
388 let step = self.range_value()?;
389 Ok(self.create_node(ParseToken::Range(None, Some(to), step)))
390 }
391 _ => Err(self.token_reader.to_error()),
392 }
393 }
394
395 fn range(&mut self, from: isize) -> Result<ParserNode, TokenError> {
396 debug!("#range");
397 match self.token_reader.next_token() {
398 Ok(Token::Key(s)) => {
399 let str_to = self.token_reader.read_value(&s);
400 let to = Self::string_to_num(str_to, || self.token_reader.to_error())?;
401 let step = self.range_value()?;
402 Ok(self.create_node(ParseToken::Range(Some(from), Some(to), step)))
403 }
404 _ => Err(self.token_reader.to_error()),
405 }
406 }
407
408 fn filter(&mut self) -> Result<ParserNode, TokenError> {
409 debug!("#filter");
410 match self.token_reader.next_token() {
411 Ok(Token::OpenParenthesis(_)) => {
412 let ret = self.exprs()?;
413 self.eat_whitespace();
414 self.close_token(ret, Token::CloseParenthesis(StrRange::new(0, 0)))
415 }
416 _ => Err(self.token_reader.to_error()),
417 }
418 }
419
420 fn exprs(&mut self) -> Result<ParserNode, TokenError> {
421 self.eat_whitespace();
422 debug!("#exprs");
423 let node = match self.token_reader.peek_token() {
424 Ok(Token::OpenParenthesis(_)) => {
425 self.eat_token();
426 trace!("\t-exprs - open_parenthesis");
427 let ret = self.exprs()?;
428 self.eat_whitespace();
429 self.close_token(ret, Token::CloseParenthesis(StrRange::new(0, 0)))?
430 }
431 _ => {
432 trace!("\t-exprs - else");
433 self.expr()?
434 }
435 };
436 self.eat_whitespace();
437 self.condition_expr(node)
438 }
439
440 fn condition_expr(&mut self, prev: ParserNode) -> Result<ParserNode, TokenError> {
441 debug!("#condition_expr");
442 match self.token_reader.peek_token() {
443 Ok(Token::And(_)) => {
444 self.eat_token();
445 Ok(ParserNode {
446 token: ParseToken::Filter(FilterToken::And),
447 left: Some(Box::new(prev)),
448 right: Some(Box::new(self.exprs()?)),
449 })
450 }
451 Ok(Token::Or(_)) => {
452 self.eat_token();
453 Ok(ParserNode {
454 token: ParseToken::Filter(FilterToken::Or),
455 left: Some(Box::new(prev)),
456 right: Some(Box::new(self.exprs()?)),
457 })
458 }
459 _ => Ok(prev),
460 }
461 }
462
463 fn expr(&mut self) -> Result<ParserNode, TokenError> {
464 debug!("#expr");
465
466 let has_prop_candidate = matches!(self.token_reader.peek_token(), Ok(Token::At(_)));
467
468 let node = self.term()?;
469 self.eat_whitespace();
470
471 if matches!(
472 self.token_reader.peek_token(),
473 Ok(Token::Equal(_))
474 | Ok(Token::NotEqual(_))
475 | Ok(Token::Little(_))
476 | Ok(Token::LittleOrEqual(_))
477 | Ok(Token::Greater(_))
478 | Ok(Token::GreaterOrEqual(_))
479 ) {
480 self.op(node)
481 } else if has_prop_candidate {
482 Ok(node)
483 } else {
484 Err(self.token_reader.to_error())
485 }
486 }
487
488 fn term_num(&mut self) -> Result<ParserNode, TokenError> {
489 debug!("#term_num");
490 match self.token_reader.next_token() {
491 Ok(Token::Key(s)) => {
492 let val = self.token_reader.read_value(&s);
493 match self.token_reader.peek_token() {
494 Ok(Token::Dot(_)) => self.term_num_float(val),
495 _ => {
496 let number = Self::string_to_num(val, || self.token_reader.to_error())?;
497 Ok(self.create_node(ParseToken::Number(number)))
498 }
499 }
500 }
501 _ => Err(self.token_reader.to_error()),
502 }
503 }
504
505 fn term_num_float(&mut self, num: &'a str) -> Result<ParserNode, TokenError> {
506 debug!("#term_num_float");
507 self.eat_token();
508 match self.token_reader.next_token() {
509 Ok(Token::Key(s)) => {
510 let frac = self.token_reader.read_value(&s);
511 let number = Self::string_to_num(&[num, ".", frac].concat(), || {
512 self.token_reader.to_error()
513 })?;
514 Ok(self.create_node(ParseToken::Number(number)))
515 }
516 _ => Err(self.token_reader.to_error()),
517 }
518 }
519
520 fn term(&mut self) -> Result<ParserNode, TokenError> {
521 debug!("#term");
522
523 if self.token_reader.peek_token().is_err() {
524 return Err(self.token_reader.to_error());
525 }
526
527 let has_term_key = if let Ok(Token::Key(s)) = self.token_reader.peek_token() {
528 Some(s.clone())
529 } else {
530 None
531 };
532
533 if let Some(s) = has_term_key {
534 let key = self.token_reader.read_value(&s);
535 return match key.as_bytes()[0] {
536 b'-' | b'0'..=b'9' => self.term_num(),
537 _ => self.boolean(),
538 };
539 }
540
541 match self.token_reader.peek_token() {
542 Ok(Token::At(_)) => {
543 self.eat_token();
544
545 let node = self.create_node(ParseToken::Relative);
546 match self.token_reader.peek_token() {
547 Ok(Token::Whitespace(_)) => {
548 self.eat_whitespace();
549 Ok(node)
550 }
551 _ => self.paths(node),
552 }
553 }
554 Ok(Token::Absolute(_)) => self.json_path(),
555 Ok(Token::DoubleQuoted(_)) | Ok(Token::SingleQuoted(_)) => self.array_quote_value(),
556 _ => Err(self.token_reader.to_error()),
557 }
558 }
559
560 fn op(&mut self, prev: ParserNode) -> Result<ParserNode, TokenError> {
561 debug!("#op");
562 let token = match self.token_reader.next_token() {
563 Ok(Token::Equal(_)) => ParseToken::Filter(FilterToken::Equal),
564 Ok(Token::NotEqual(_)) => ParseToken::Filter(FilterToken::NotEqual),
565 Ok(Token::Little(_)) => ParseToken::Filter(FilterToken::Little),
566 Ok(Token::LittleOrEqual(_)) => ParseToken::Filter(FilterToken::LittleOrEqual),
567 Ok(Token::Greater(_)) => ParseToken::Filter(FilterToken::Greater),
568 Ok(Token::GreaterOrEqual(_)) => ParseToken::Filter(FilterToken::GreaterOrEqual),
569 _ => {
570 return Err(self.token_reader.to_error());
571 }
572 };
573
574 self.eat_whitespace();
575
576 Ok(ParserNode {
577 token,
578 left: Some(Box::new(prev)),
579 right: Some(Box::new(self.term()?)),
580 })
581 }
582
583 fn eat_whitespace(&mut self) {
584 while let Ok(Token::Whitespace(_)) = self.token_reader.peek_token() {
585 let _ = self.token_reader.next_token();
586 }
587 }
588
589 fn eat_token(&mut self) {
590 let _ = self.token_reader.next_token();
591 }
592
593 fn close_token(&mut self, ret: ParserNode, token: Token) -> Result<ParserNode, TokenError> {
594 debug!("#close_token");
595 match self.token_reader.next_token() {
596 Ok(ref t) if t.is_match_token_type(token) => Ok(ret),
597 _ => Err(self.token_reader.to_error()),
598 }
599 }
600
601 fn create_node(&mut self, token: ParseToken) -> ParserNode {
602 ParserNode {
603 left: None,
604 right: None,
605 token,
606 }
607 }
608}
609
610#[derive(Debug, Clone)]
611pub struct ParserNode {
612 pub left: Option<Box<ParserNode>>,
613 pub right: Option<Box<ParserNode>>,
614 pub token: ParseToken,
615}
616
617#[cfg(test)]
618mod path_parser_tests {
619 use crate::paths::path_parser::PathParser;
620 use crate::paths::str_reader::StrRange;
621 use crate::paths::tokens::{FilterToken, ParseToken};
622 use crate::paths::ParserTokenHandler;
623 use crate::trace;
624
625 struct NodeVisitorTestImpl<'a> {
626 input: &'a str,
627 stack: Vec<ParseToken>,
628 }
629
630 impl<'a> NodeVisitorTestImpl<'a> {
631 fn new(input: &'a str) -> Self {
632 NodeVisitorTestImpl {
633 input,
634 stack: Vec::new(),
635 }
636 }
637
638 fn start(&mut self) -> Result<Vec<ParseToken>, String> {
639 let parser = PathParser::compile(self.input).map_err(|_| "Token Error")?;
640 let _ = parser.parse(self);
641 Ok(self.stack.split_off(0))
642 }
643 }
644
645 impl<'a> ParserTokenHandler<'a> for NodeVisitorTestImpl<'a> {
646 fn handle<F>(&mut self, token: &ParseToken, _: &F)
647 where
648 F: Fn(&StrRange) -> &'a str,
649 {
650 trace!("handle {:?}", token);
651 self.stack.push(token.clone());
652 }
653 }
654
655 fn setup() {
656 let _ = env_logger::try_init();
657 }
658
659 fn run(input: &str) -> Result<Vec<ParseToken>, String> {
660 let mut interpreter = NodeVisitorTestImpl::new(input);
661 interpreter.start()
662 }
663
664 #[test]
665 fn parse_error() {
666 setup();
667
668 fn invalid(path: &str) {
669 assert!(run(path).is_err());
670 }
671
672 invalid("$[]");
673 invalid("$[a]");
674 invalid("$[?($.a)]");
675 invalid("$[?(@.a > @.b]");
676 invalid("$[?(@.a < @.b&&(@.c < @.d)]");
677 invalid("@.");
678 invalid("$..[?(a <= @.a)]"); invalid("$['a', b]");
680 invalid("$[0, >=]");
681 invalid("$[a:]");
682 invalid("$[:a]");
683 invalid("$[::a]");
684 invalid("$[:>]");
685 invalid("$[1:>]");
686 invalid("$[1,,]");
687 invalid("$[?]");
688 invalid("$[?(1 = 1)]");
689 invalid("$[?(1 = >)]");
690 }
691
692 #[test]
693 fn parse_path() {
694 setup();
695
696 assert_eq!(
697 run("$.aa"),
698 Ok(vec![
699 ParseToken::Absolute,
700 ParseToken::In,
701 ParseToken::Key(StrRange::new(2, "aa".len()))
702 ])
703 );
704
705 assert_eq!(
706 run("$.00.a"),
707 Ok(vec![
708 ParseToken::Absolute,
709 ParseToken::In,
710 ParseToken::Key(StrRange::new(2, "00".len())),
711 ParseToken::In,
712 ParseToken::Key(StrRange::new(5, "a".len()))
713 ])
714 );
715
716 assert_eq!(
717 run("$.00.韓창.seok"),
718 Ok(vec![
719 ParseToken::Absolute,
720 ParseToken::In,
721 ParseToken::Key(StrRange::new(2, "00".len())),
722 ParseToken::In,
723 ParseToken::Key(StrRange::new(5, "韓창".chars().map(|c| c.len_utf8()).sum())),
724 ParseToken::In,
725 ParseToken::Key(StrRange::new(12, "seok".len()))
726 ])
727 );
728
729 assert_eq!(
730 run("$.*"),
731 Ok(vec![ParseToken::Absolute, ParseToken::In, ParseToken::All])
732 );
733
734 assert_eq!(
735 run("$..*"),
736 Ok(vec![
737 ParseToken::Absolute,
738 ParseToken::Leaves,
739 ParseToken::All
740 ])
741 );
742
743 assert_eq!(
744 run("$..[0]"),
745 Ok(vec![
746 ParseToken::Absolute,
747 ParseToken::Leaves,
748 ParseToken::Array,
749 ParseToken::Number(0.0),
750 ParseToken::ArrayEof
751 ])
752 );
753
754 assert_eq!(
755 run("$.$a"),
756 Ok(vec![
757 ParseToken::Absolute,
758 ParseToken::In,
759 ParseToken::Key(StrRange::new(2, "$a".len()))
760 ])
761 );
762
763 assert_eq!(
764 run("$.['$a']"),
765 Ok(vec![
766 ParseToken::Absolute,
767 ParseToken::Array,
768 ParseToken::Key(StrRange::new(3, "'$a'".len())),
769 ParseToken::ArrayEof,
770 ])
771 );
772
773 if run("$.").is_ok() {
774 panic!();
775 }
776
777 if run("$..").is_ok() {
778 panic!();
779 }
780
781 if run("$. a").is_ok() {
782 panic!();
783 }
784 }
785
786 #[test]
787 fn parse_array_syntax() {
788 setup();
789
790 assert_eq!(
791 run("$.book[?(@.isbn)]"),
792 Ok(vec![
793 ParseToken::Absolute,
794 ParseToken::In,
795 ParseToken::Key(StrRange::new(2, "book".len())),
796 ParseToken::Array,
797 ParseToken::Relative,
798 ParseToken::In,
799 ParseToken::Key(StrRange::new(11, "isbn".len())),
800 ParseToken::ArrayEof
801 ])
802 );
803
804 assert_eq!(
808 run("$.[*]"),
809 Ok(vec![
810 ParseToken::Absolute,
811 ParseToken::Array,
812 ParseToken::All,
813 ParseToken::ArrayEof
814 ])
815 );
816
817 assert_eq!(
818 run("$.a[*]"),
819 Ok(vec![
820 ParseToken::Absolute,
821 ParseToken::In,
822 ParseToken::Key(StrRange::new(2, "a".len())),
823 ParseToken::Array,
824 ParseToken::All,
825 ParseToken::ArrayEof
826 ])
827 );
828
829 assert_eq!(
830 run("$.a[*].가"),
831 Ok(vec![
832 ParseToken::Absolute,
833 ParseToken::In,
834 ParseToken::Key(StrRange::new(2, "a".len())),
835 ParseToken::Array,
836 ParseToken::All,
837 ParseToken::ArrayEof,
838 ParseToken::In,
839 ParseToken::Key(StrRange::new(7, '가'.len_utf8()))
840 ])
841 );
842
843 assert_eq!(
844 run("$.a[0][1]"),
845 Ok(vec![
846 ParseToken::Absolute,
847 ParseToken::In,
848 ParseToken::Key(StrRange::new(2, "a".len())),
849 ParseToken::Array,
850 ParseToken::Number(0_f64),
851 ParseToken::ArrayEof,
852 ParseToken::Array,
853 ParseToken::Number(1_f64),
854 ParseToken::ArrayEof
855 ])
856 );
857
858 assert_eq!(
859 run("$.a[1,2]"),
860 Ok(vec![
861 ParseToken::Absolute,
862 ParseToken::In,
863 ParseToken::Key(StrRange::new(2, "a".len())),
864 ParseToken::Array,
865 ParseToken::Union(vec![1, 2]),
866 ParseToken::ArrayEof
867 ])
868 );
869
870 assert_eq!(
871 run("$.a[10:]"),
872 Ok(vec![
873 ParseToken::Absolute,
874 ParseToken::In,
875 ParseToken::Key(StrRange::new(2, "a".len())),
876 ParseToken::Array,
877 ParseToken::Range(Some(10), None, None),
878 ParseToken::ArrayEof
879 ])
880 );
881
882 assert_eq!(
883 run("$.a[:11]"),
884 Ok(vec![
885 ParseToken::Absolute,
886 ParseToken::In,
887 ParseToken::Key(StrRange::new(2, "a".len())),
888 ParseToken::Array,
889 ParseToken::Range(None, Some(11), None),
890 ParseToken::ArrayEof
891 ])
892 );
893
894 assert_eq!(
895 run("$.a[-12:13]"),
896 Ok(vec![
897 ParseToken::Absolute,
898 ParseToken::In,
899 ParseToken::Key(StrRange::new(2, "a".len())),
900 ParseToken::Array,
901 ParseToken::Range(Some(-12), Some(13), None),
902 ParseToken::ArrayEof
903 ])
904 );
905
906 assert_eq!(
907 run(r#"$[0:3:2]"#),
908 Ok(vec![
909 ParseToken::Absolute,
910 ParseToken::Array,
911 ParseToken::Range(Some(0), Some(3), Some(2)),
912 ParseToken::ArrayEof
913 ])
914 );
915
916 assert_eq!(
917 run(r#"$[:3:2]"#),
918 Ok(vec![
919 ParseToken::Absolute,
920 ParseToken::Array,
921 ParseToken::Range(None, Some(3), Some(2)),
922 ParseToken::ArrayEof
923 ])
924 );
925
926 assert_eq!(
927 run(r#"$[:]"#),
928 Ok(vec![
929 ParseToken::Absolute,
930 ParseToken::Array,
931 ParseToken::Range(None, None, None),
932 ParseToken::ArrayEof
933 ])
934 );
935
936 assert_eq!(
937 run(r#"$[::]"#),
938 Ok(vec![
939 ParseToken::Absolute,
940 ParseToken::Array,
941 ParseToken::Range(None, None, None),
942 ParseToken::ArrayEof
943 ])
944 );
945
946 assert_eq!(
947 run(r#"$[::2]"#),
948 Ok(vec![
949 ParseToken::Absolute,
950 ParseToken::Array,
951 ParseToken::Range(None, None, Some(2)),
952 ParseToken::ArrayEof
953 ])
954 );
955
956 assert_eq!(
957 run(r#"$["a", 'b']"#),
958 Ok(vec![
959 ParseToken::Absolute,
960 ParseToken::Array,
961 ParseToken::Keys(vec![
962 StrRange::new(2, "\"a\"".len()),
963 StrRange::new(7, "'b'".len())
964 ]),
965 ParseToken::ArrayEof
966 ])
967 );
968
969 assert_eq!(
970 run("$.a[?(1>2)]"),
971 Ok(vec![
972 ParseToken::Absolute,
973 ParseToken::In,
974 ParseToken::Key(StrRange::new(2, "a".len())),
975 ParseToken::Array,
976 ParseToken::Number(1_f64),
977 ParseToken::Number(2_f64),
978 ParseToken::Filter(FilterToken::Greater),
979 ParseToken::ArrayEof
980 ])
981 );
982
983 assert_eq!(
984 run("$.a[?($.b>3)]"),
985 Ok(vec![
986 ParseToken::Absolute,
987 ParseToken::In,
988 ParseToken::Key(StrRange::new(2, "a".len())),
989 ParseToken::Array,
990 ParseToken::Absolute,
991 ParseToken::In,
992 ParseToken::Key(StrRange::new(8, "b".len())),
993 ParseToken::Number(3_f64),
994 ParseToken::Filter(FilterToken::Greater),
995 ParseToken::ArrayEof
996 ])
997 );
998
999 assert_eq!(
1000 run("$[?($.c>@.d && 1==2)]"),
1001 Ok(vec![
1002 ParseToken::Absolute,
1003 ParseToken::Array,
1004 ParseToken::Absolute,
1005 ParseToken::In,
1006 ParseToken::Key(StrRange::new(6, "c".len())),
1007 ParseToken::Relative,
1008 ParseToken::In,
1009 ParseToken::Key(StrRange::new(10, "c".len())),
1010 ParseToken::Filter(FilterToken::Greater),
1011 ParseToken::Number(1_f64),
1012 ParseToken::Number(2_f64),
1013 ParseToken::Filter(FilterToken::Equal),
1014 ParseToken::Filter(FilterToken::And),
1015 ParseToken::ArrayEof
1016 ])
1017 );
1018
1019 assert_eq!(
1020 run("$[?($.c>@.d&&(1==2||3>=4))]"),
1021 Ok(vec![
1022 ParseToken::Absolute,
1023 ParseToken::Array,
1024 ParseToken::Absolute,
1025 ParseToken::In,
1026 ParseToken::Key(StrRange::new(6, "c".len())),
1027 ParseToken::Relative,
1028 ParseToken::In,
1029 ParseToken::Key(StrRange::new(10, "d".len())),
1030 ParseToken::Filter(FilterToken::Greater),
1031 ParseToken::Number(1_f64),
1032 ParseToken::Number(2_f64),
1033 ParseToken::Filter(FilterToken::Equal),
1034 ParseToken::Number(3_f64),
1035 ParseToken::Number(4_f64),
1036 ParseToken::Filter(FilterToken::GreaterOrEqual),
1037 ParseToken::Filter(FilterToken::Or),
1038 ParseToken::Filter(FilterToken::And),
1039 ParseToken::ArrayEof
1040 ])
1041 );
1042
1043 assert_eq!(
1044 run("$[?(@.a<@.b)]"),
1045 Ok(vec![
1046 ParseToken::Absolute,
1047 ParseToken::Array,
1048 ParseToken::Relative,
1049 ParseToken::In,
1050 ParseToken::Key(StrRange::new(6, "a".len())),
1051 ParseToken::Relative,
1052 ParseToken::In,
1053 ParseToken::Key(StrRange::new(10, "b".len())),
1054 ParseToken::Filter(FilterToken::Little),
1055 ParseToken::ArrayEof
1056 ])
1057 );
1058
1059 assert_eq!(
1060 run("$[*][*][*]"),
1061 Ok(vec![
1062 ParseToken::Absolute,
1063 ParseToken::Array,
1064 ParseToken::All,
1065 ParseToken::ArrayEof,
1066 ParseToken::Array,
1067 ParseToken::All,
1068 ParseToken::ArrayEof,
1069 ParseToken::Array,
1070 ParseToken::All,
1071 ParseToken::ArrayEof
1072 ])
1073 );
1074
1075 assert_eq!(
1076 run("$['a']['bb']"),
1077 Ok(vec![
1078 ParseToken::Absolute,
1079 ParseToken::Array,
1080 ParseToken::Key(StrRange::new(2, "'a'".len())),
1081 ParseToken::ArrayEof,
1082 ParseToken::Array,
1083 ParseToken::Key(StrRange::new(7, "'bb'".len())),
1084 ParseToken::ArrayEof
1085 ])
1086 );
1087
1088 assert_eq!(
1089 run("$.a[?(@.e==true)]"),
1090 Ok(vec![
1091 ParseToken::Absolute,
1092 ParseToken::In,
1093 ParseToken::Key(StrRange::new(2, "a".len())),
1094 ParseToken::Array,
1095 ParseToken::Relative,
1096 ParseToken::In,
1097 ParseToken::Key(StrRange::new(8, "e".len())),
1098 ParseToken::Bool(true),
1099 ParseToken::Filter(FilterToken::Equal),
1100 ParseToken::ArrayEof
1101 ])
1102 );
1103
1104 assert_eq!(
1105 run(r#"$[?(@ > 1)]"#),
1106 Ok(vec![
1107 ParseToken::Absolute,
1108 ParseToken::Array,
1109 ParseToken::Relative,
1110 ParseToken::Number(1_f64),
1111 ParseToken::Filter(FilterToken::Greater),
1112 ParseToken::ArrayEof
1113 ])
1114 );
1115
1116 assert_eq!(
1117 run("$[:]"),
1118 Ok(vec![
1119 ParseToken::Absolute,
1120 ParseToken::Array,
1121 ParseToken::Range(None, None, None),
1122 ParseToken::ArrayEof
1123 ])
1124 );
1125
1126 assert_eq!(
1127 run(r#"$['single\'quote']"#),
1128 Ok(vec![
1129 ParseToken::Absolute,
1130 ParseToken::Array,
1131 ParseToken::Key(StrRange::new(2, r#"'single\'quote'"#.len())),
1132 ParseToken::ArrayEof
1133 ])
1134 );
1135
1136 assert_eq!(
1137 run(r#"$["single\"quote"]"#),
1138 Ok(vec![
1139 ParseToken::Absolute,
1140 ParseToken::Array,
1141 ParseToken::Key(StrRange::new(2, r#""single\"quote""#.len())),
1142 ParseToken::ArrayEof
1143 ])
1144 );
1145 }
1146
1147 #[test]
1148 fn parse_array_float() {
1149 setup();
1150
1151 assert_eq!(
1152 run("$[?(1.1<2.1)]"),
1153 Ok(vec![
1154 ParseToken::Absolute,
1155 ParseToken::Array,
1156 ParseToken::Number(1.1),
1157 ParseToken::Number(2.1),
1158 ParseToken::Filter(FilterToken::Little),
1159 ParseToken::ArrayEof
1160 ])
1161 );
1162
1163 if run("$[1.1]").is_ok() {
1164 panic!();
1165 }
1166
1167 if run("$[?(1.1<.2)]").is_ok() {
1168 panic!();
1169 }
1170
1171 if run("$[?(1.1<2.)]").is_ok() {
1172 panic!();
1173 }
1174
1175 if run("$[?(1.1<2.a)]").is_ok() {
1176 panic!();
1177 }
1178 }
1179}