oni_comb_parser_rs/lib.rs
1#![warn(dead_code)]
2#![allow(incomplete_features)]
3mod core;
4mod extension;
5mod internal;
6pub mod utils;
7
8pub mod prelude {
9 pub use crate::core::*;
10 pub use crate::extension::parser::*;
11 use crate::extension::parsers::*;
12 use crate::internal::*;
13 pub use crate::utils::*;
14 use std::fmt::{Debug, Display};
15
16 /// Returns a [Parser] that does nothing.
17 ///
18 /// # Example
19 ///
20 /// ```rust
21 /// # use oni_comb_parser_rs::prelude::*;
22 ///
23 /// let text: &str = "a";
24 /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
25 ///
26 /// let parser: Parser<char, ()> = unit();
27 ///
28 /// let result: ParseResult<char, ()> = parser.parse(&input);
29 ///
30 /// assert!(result.is_success());
31 /// assert_eq!(result.success().unwrap(), ());
32 /// ```
33 pub fn unit<'a, I>() -> Parser<'a, I, ()> {
34 ParsersImpl::unit()
35 }
36
37 /// Returns a [Parser] that does nothing. It is an alias for `unit()`.
38 ///
39 /// # Example
40 ///
41 /// ```rust
42 /// # use oni_comb_parser_rs::prelude::*;
43 ///
44 /// let text: &str = "a";
45 /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
46 ///
47 /// let parser: Parser<char, ()> = empty();
48 ///
49 /// let result: ParseResult<char, ()> = parser.parse(&input);
50 ///
51 /// assert!(result.is_success());
52 /// assert_eq!(result.success().unwrap(), ());
53 /// ```
54 pub fn empty<'a, I>() -> Parser<'a, I, ()> {
55 ParsersImpl::empty()
56 }
57
58 pub fn begin<'a, I>() -> Parser<'a, I, ()>
59 where
60 I: Debug + Display + 'a, {
61 ParsersImpl::begin()
62 }
63
64 /// Returns a [Parser] representing the termination.
65 ///
66 /// Returns `Ok(())` if the termination is parsed successfully, `Err(Mismatch)` if the parsing fails.
67 ///
68 /// # Example
69 ///
70 /// ```rust
71 /// # use oni_comb_parser_rs::prelude::*;
72 ///
73 /// let text: &str = "a";
74 /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
75 ///
76 /// let parser: Parser<char, ()> = end();
77 ///
78 /// let result: Result<(), ParseError<char>> = parser.parse(&input).to_result();
79 ///
80 /// assert!(result.is_err());
81 /// ```
82 pub fn end<'a, I>() -> Parser<'a, I, ()>
83 where
84 I: Debug + Display + 'a, {
85 ParsersImpl::end()
86 }
87
88 /// Returns a [Parser] representing the successful parsing result.
89 ///
90 /// # Example
91 ///
92 /// ```rust
93 /// use oni_comb_parser_rs::prelude::*;
94 ///
95 /// let text: &str = "x";
96 /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
97 ///
98 /// let parser: Parser<char, char> = successful('a');
99 ///
100 /// let result: ParseResult<char, char> = parser.parse(&input);
101 ///
102 /// assert!(result.is_success());
103 /// assert_eq!(result.success().unwrap(), 'a');
104 /// ```
105 pub fn successful<'a, I, A>(value: A) -> Parser<'a, I, A>
106 where
107 I: 'a,
108 A: Clone + 'a, {
109 ParsersImpl::successful(value)
110 }
111
112 /// Returns a [Parser] representing the successful parsing result.
113 ///
114 /// - f: a closure that returns the parsed result value.
115 ///
116 /// # Example
117 ///
118 /// ```rust
119 /// # use oni_comb_parser_rs::prelude::*;
120 ///
121 /// let text: &str = "x";
122 /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
123 ///
124 /// let parser: Parser<char, char> = successful_lazy(|| 'a');
125 ///
126 /// let result: ParseResult<char, char> = parser.parse(&input);
127 ///
128 /// assert!(result.is_success());
129 /// assert_eq!(result.success().unwrap(), 'a');
130 /// ```
131 pub fn successful_lazy<'a, I, A, F>(f: F) -> Parser<'a, I, A>
132 where
133 I: 'a,
134 F: Fn() -> A + 'a,
135 A: 'a, {
136 ParsersImpl::successful_lazy(f)
137 }
138
139 /// Returns a [Parser] that represents the result of the failed parsing.
140 ///
141 /// - value: [ParseError]
142 ///
143 /// # Example
144 ///
145 /// ```rust
146 /// # use oni_comb_parser_rs::prelude::*;
147 ///
148 /// let text: &str = "x";
149 /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
150 ///
151 /// let parse_error: ParseError<char> = ParseError::of_in_complete();
152 ///
153 /// let parser: Parser<char, ()> = failed(parse_error.clone(), CommittedStatus::Committed);
154 ///
155 /// let result: ParseResult<char, ()> = parser.parse(&input);
156 ///
157 /// assert!(result.is_failure());
158 /// assert_eq!(result.failure().unwrap(), parse_error);
159 /// ```
160 pub fn failed<'a, I, A>(value: ParseError<'a, I>, commit: CommittedStatus) -> Parser<'a, I, A>
161 where
162 I: Clone + 'a,
163 A: 'a, {
164 ParsersImpl::failed(value, commit)
165 }
166
167 /// Returns a [Parser] that returns and commits the failed parsing result.
168 ///
169 /// - value: [ParseError]
170 ///
171 /// # Example
172 ///
173 /// ```rust
174 /// # use oni_comb_parser_rs::prelude::*;
175 ///
176 /// let text: &str = "x";
177 /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
178 ///
179 /// let parse_error: ParseError<char> = ParseError::of_in_complete();
180 ///
181 /// let parser: Parser<char, ()> = failed_with_commit(parse_error.clone());
182 ///
183 /// let result: ParseResult<char, ()> = parser.parse(&input);
184 ///
185 /// assert!(result.is_failure());
186 /// assert_eq!(result.committed_status().unwrap(), CommittedStatus::Committed);
187 ///
188 /// assert_eq!(result.failure().unwrap(), parse_error);
189 /// ```
190 pub fn failed_with_commit<'a, I, A>(value: ParseError<'a, I>) -> Parser<'a, I, A>
191 where
192 I: Clone + 'a,
193 A: 'a, {
194 ParsersImpl::failed(value, CommittedStatus::Committed)
195 }
196
197 /// Returns a [Parser] that returns failed parsing results and does not commit.
198 ///
199 /// - value: [ParseError]
200 ///
201 /// # Example
202 ///
203 /// ```rust
204 /// # use oni_comb_parser_rs::prelude::*;
205 ///
206 /// let text: &str = "x";
207 /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
208 ///
209 /// let parse_error: ParseError<char> = ParseError::of_in_complete();
210 ///
211 /// let parser: Parser<char, ()> = failed_with_uncommit(parse_error.clone());
212 ///
213 /// let result: ParseResult<char, ()> = parser.parse(&input);
214 ///
215 /// assert!(result.is_failure());
216 /// assert_eq!(result.committed_status().unwrap(), CommittedStatus::Uncommitted);
217 ///
218 /// assert_eq!(result.failure().unwrap(), parse_error);
219 /// ```
220 pub fn failed_with_uncommit<'a, I, A>(value: ParseError<'a, I>) -> Parser<'a, I, A>
221 where
222 I: Clone + 'a,
223 A: 'a, {
224 ParsersImpl::failed(value, CommittedStatus::Uncommitted)
225 }
226
227 /// Returns a [Parser] that represents the result of the failed parsing.
228 ///
229 /// - f: Closure that returns failed analysis results.
230 ///
231 /// # Example
232 ///
233 /// ```rust
234 /// # use oni_comb_parser_rs::prelude::*;
235 ///
236 /// let text: &str = "x";
237 /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
238 ///
239 /// let parse_error: ParseError<char> = ParseError::of_in_complete();
240 ///
241 /// let parser: Parser<char, ()> = failed_lazy(|| (parse_error.clone(), CommittedStatus::Committed));
242 ///
243 /// let result: ParseResult<char, ()> = parser.parse(&input);
244 ///
245 /// assert!(result.is_failure());
246 /// assert_eq!(result.failure().unwrap(), parse_error);
247 /// ```
248 pub fn failed_lazy<'a, I, A, F>(f: F) -> Parser<'a, I, A>
249 where
250 F: Fn() -> (ParseError<'a, I>, CommittedStatus) + 'a,
251 I: 'a,
252 A: 'a, {
253 ParsersImpl::failed_lazy(f)
254 }
255
256 // --- Element Parsers ---
257
258 /// Returns a [Parser] that parses an any element.(for reference)
259 ///
260 /// # Example
261 ///
262 /// ```rust
263 /// # use oni_comb_parser_rs::prelude::*;
264 ///
265 /// let text: &str = "x";
266 /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
267 ///
268 /// let parser: Parser<char, &char> = elm_any_ref();
269 ///
270 /// let result: ParseResult<char, &char> = parser.parse(&input);
271 ///
272 /// assert!(result.is_success());
273 /// assert_eq!(result.success().unwrap(), &input[0]);
274 /// ```
275 pub fn elm_any_ref<'a, I>() -> Parser<'a, I, &'a I>
276 where
277 I: Element, {
278 ParsersImpl::elm_any_ref()
279 }
280
281 /// Returns a [Parser] that parses an any element.
282 ///
283 /// # Example
284 ///
285 /// ```rust
286 /// # use oni_comb_parser_rs::prelude::*;
287 ///
288 /// let text: &str = "x";
289 /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
290 ///
291 /// let parser: Parser<char, char> = elm_any();
292 ///
293 /// let result: ParseResult<char, char> = parser.parse(&input);
294 ///
295 /// assert!(result.is_success());
296 /// assert_eq!(result.success().unwrap(), input[0]);
297 /// ```
298 pub fn elm_any<'a, I>() -> Parser<'a, I, I>
299 where
300 I: Element, {
301 ParsersImpl::elm_any()
302 }
303
304 /// Returns a [Parser] that parses the specified element.(for reference)
305 ///
306 /// - element: element
307 ///
308 /// # Example
309 ///
310 /// ```rust
311 /// # use oni_comb_parser_rs::prelude::*;
312 ///
313 /// let text: &str = "x";
314 /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
315 ///
316 /// let parser: Parser<char, &char> = elm_ref('x');
317 ///
318 /// let result: ParseResult<char, &char> = parser.parse(&input);
319 ///
320 /// assert!(result.is_success());
321 /// assert_eq!(result.success().unwrap(), &input[0]);
322 /// ```
323 pub fn elm_ref<'a, I>(element: I) -> Parser<'a, I, &'a I>
324 where
325 I: Element, {
326 ParsersImpl::elm_ref(element)
327 }
328
329 /// Returns a [Parser] that parses the specified element.
330 ///
331 /// - element: an element
332 ///
333 /// # Example
334 ///
335 /// ```rust
336 /// # use oni_comb_parser_rs::prelude::*;
337 ///
338 /// let text: &str = "x";
339 /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
340 ///
341 /// let parser: Parser<char, char> = elm('x');
342 ///
343 /// let result: ParseResult<char, char> = parser.parse(&input);
344 ///
345 /// assert!(result.is_success());
346 /// assert_eq!(result.success().unwrap(), input[0]);
347 /// ```
348 pub fn elm<'a, I>(element: I) -> Parser<'a, I, I>
349 where
350 I: Element, {
351 ParsersImpl::elm(element)
352 }
353
354 /// Returns a [Parser] that parses the elements that satisfy the specified closure conditions.(for reference)
355 ///
356 /// - f: Closure(クロージャ)
357 ///
358 /// # Example
359 ///
360 /// ```rust
361 /// # use oni_comb_parser_rs::prelude::*;
362 ///
363 /// let text: &str = "x";
364 /// let input: Vec<char> = text.chars().collect::<Vec<_>>();
365 ///
366 /// let parser: Parser<char, &char> = elm_pred_ref(|c| *c == 'x');
367 ///
368 /// let result: ParseResult<char, &char> = parser.parse(&input);
369 ///
370 /// assert!(result.is_success());
371 /// assert_eq!(result.success().unwrap(), &input[0]);
372 /// ```
373 pub fn elm_pred_ref<'a, I, F>(f: F) -> Parser<'a, I, &'a I>
374 where
375 I: Element + 'static,
376 F: Fn(&I) -> bool + 'static, {
377 ParsersImpl::elm_pred_ref(f)
378 }
379
380 /// Returns a [Parser] that parses the elements that satisfy the specified closure conditions.
381 ///
382 /// - f: closure
383 ///
384 /// # Example
385 ///
386 /// ## Success case
387 ///
388 /// ```rust
389 /// # use oni_comb_parser_rs::prelude::*;
390 ///
391 /// let text: &str = "x";
392 /// let input = text.chars().collect::<Vec<_>>();
393 ///
394 /// let parser: Parser<char, char> = elm_pred(|c| *c == 'x');
395 ///
396 /// let result: ParseResult<char, char> = parser.parse(&input);
397 ///
398 /// assert!(result.is_success());
399 /// assert_eq!(result.success().unwrap(), input[0]);
400 /// ```
401 pub fn elm_pred<'a, I, F>(f: F) -> Parser<'a, I, I>
402 where
403 F: Fn(&I) -> bool + 'static,
404 I: Element, {
405 ParsersImpl::elm_pred(f)
406 }
407
408 /// Returns a [Parser] that parses the elements in the specified set. (for reference)
409 ///
410 /// - set: element of sets
411 ///
412 /// # Example
413 ///
414 /// ```rust
415 /// use std::iter::FromIterator;
416 /// use oni_comb_parser_rs::prelude::*;
417 ///
418 /// let text: &str = "xyz";
419 /// let input = text.chars().collect::<Vec<_>>();
420 ///
421 /// let parser: Parser<char, String> = elm_ref_of("xyz").of_many1().map(|chars| chars.into_iter().map(|c| *c).collect::<String>());
422 ///
423 /// let result: ParseResult<char, String> = parser.parse(&input);
424 ///
425 /// assert!(result.is_success());
426 /// assert_eq!(result.success().unwrap(), text);
427 /// ```
428 pub fn elm_ref_of<'a, I, S>(set: &'static S) -> Parser<'a, I, &'a I>
429 where
430 I: Element,
431 S: Set<I> + ?Sized + 'static, {
432 ParsersImpl::elm_ref_of(set)
433 }
434
435 /// Returns a [Parser] that parses the elements in the specified set.
436 ///
437 /// - set: element of sets
438 ///
439 /// # Example
440 ///
441 /// ```rust
442 /// # use std::iter::FromIterator;
443 /// # use oni_comb_parser_rs::prelude::*;
444 ///
445 /// let text: &str = "xyz";
446 /// let input = text.chars().collect::<Vec<_>>();
447 ///
448 /// let parser: Parser<char, String> = elm_of("xyz").of_many1().map(String::from_iter);
449 ///
450 /// let result: ParseResult<char, String> = parser.parse(&input);
451 ///
452 /// assert!(result.is_success());
453 /// assert_eq!(result.success().unwrap(), text);
454 /// ```
455 pub fn elm_of<'a, I, S>(set: &'static S) -> Parser<'a, I, I>
456 where
457 I: Element,
458 S: Set<I> + ?Sized + 'static, {
459 ParsersImpl::elm_of(set)
460 }
461
462 /// Returns a [Parser] that parses the elements in the specified range. (for reference)
463 ///
464 /// - start: start element
465 /// - end: end element
466 ///
467 /// # Example
468 ///
469 /// ```rust
470 /// use std::iter::FromIterator;
471 /// use oni_comb_parser_rs::prelude::*;
472 ///
473 /// let text: &str = "xyz";
474 /// let input = text.chars().collect::<Vec<_>>();
475 ///
476 /// let parser: Parser<char, String> = elm_in_ref('x', 'z').of_many1().map(String::from_iter);
477 ///
478 /// let result: ParseResult<char, String> = parser.parse(&input);
479 ///
480 /// assert!(result.is_success());
481 /// assert_eq!(result.success().unwrap(), text);
482 /// ```
483 pub fn elm_in_ref<'a, I>(start: I, end: I) -> Parser<'a, I, &'a I>
484 where
485 I: Element, {
486 ParsersImpl::elm_ref_in(start, end)
487 }
488
489 /// Returns a [Parser] that parses the elements in the specified range.
490 ///
491 /// - start: start element
492 /// - end: end element
493 ///
494 /// # Example
495 ///
496 /// ```rust
497 /// use std::iter::FromIterator;
498 /// use oni_comb_parser_rs::prelude::*;
499 ///
500 /// let text: &str = "xyz";
501 /// let input = text.chars().collect::<Vec<_>>();
502 ///
503 /// let parser: Parser<char, String> = elm_in('x', 'z').of_many1().map(String::from_iter);
504 ///
505 /// let result: ParseResult<char, String> = parser.parse(&input);
506 ///
507 /// assert!(result.is_success());
508 /// assert_eq!(result.success().unwrap(), text);
509 /// ```
510 pub fn elm_in<'a, I>(start: I, end: I) -> Parser<'a, I, I>
511 where
512 I: Element, {
513 ParsersImpl::elm_in(start, end)
514 }
515
516 /// Returns a [Parser] that parses the elements in the specified range. (for reference)
517 ///
518 /// - start: a start element
519 /// - end: an end element, process up to the element at end - 1
520 ///
521 /// # Example
522 ///
523 /// ```rust
524 /// use std::iter::FromIterator;
525 /// use oni_comb_parser_rs::prelude::*;
526 ///
527 /// let text: &str = "wxy";
528 /// let input = text.chars().collect::<Vec<_>>();
529 ///
530 /// let parser: Parser<char, String> = elm_from_until_ref('w', 'z').of_many1().map(String::from_iter);
531 ///
532 /// let result: ParseResult<char, String> = parser.parse(&input);
533 ///
534 /// assert!(result.is_success());
535 /// assert_eq!(result.success().unwrap(), text);
536 /// ```
537 pub fn elm_from_until_ref<'a, I>(start: I, end: I) -> Parser<'a, I, &'a I>
538 where
539 I: Element, {
540 ParsersImpl::elm_ref_from_until(start, end)
541 }
542
543 /// Returns a [Parser] that parses the elements in the specified range.
544 ///
545 /// - start: a start element
546 /// - end: an end element, process up to the element at end - 1
547 ///
548 /// - start: 開始要素
549 /// - end: 終了要素, end - 1の要素まで処理
550 ///
551 /// # Example
552 ///
553 /// ```rust
554 /// use std::iter::FromIterator;
555 /// use oni_comb_parser_rs::prelude::*;
556 ///
557 /// let text: &str = "wxy";
558 /// let input = text.chars().collect::<Vec<_>>();
559 ///
560 /// let parser: Parser<char, String> = elm_from_until('w', 'z').of_many1().map(String::from_iter);
561 ///
562 /// let result: ParseResult<char, String> = parser.parse(&input);
563 ///
564 /// assert!(result.is_success());
565 /// assert_eq!(result.success().unwrap(), text);
566 /// ```
567 pub fn elm_from_until<'a, I>(start: I, end: I) -> Parser<'a, I, I>
568 where
569 I: Element, {
570 ParsersImpl::elm_from_until(start, end)
571 }
572
573 /// Returns a [Parser] that parses elements that do not contain elements of the specified set.(for reference)
574 ///
575 /// - set: a element of sets
576 ///
577 /// # Example
578 ///
579 /// ```rust
580 /// use std::iter::FromIterator;
581 /// use oni_comb_parser_rs::prelude::*;
582 ///
583 /// let text: &str = "xyz";
584 /// let input = text.chars().collect::<Vec<_>>();
585 ///
586 /// let parser: Parser<char, String> = none_ref_of("abc").of_many1().map(String::from_iter);
587 ///
588 /// let result: ParseResult<char, String> = parser.parse(&input);
589 ///
590 /// assert!(result.is_success());
591 /// assert_eq!(result.success().unwrap(), text);
592 /// ```
593 pub fn none_ref_of<'a, I, S>(set: &'static S) -> Parser<'a, I, &'a I>
594 where
595 I: Element,
596 S: Set<I> + ?Sized + 'static, {
597 ParsersImpl::none_ref_of(set)
598 }
599
600 /// Returns a [Parser] that parses elements that do not contain elements of the specified set.
601 ///
602 /// - set: an element of sets
603 ///
604 /// # Example
605 ///
606 /// ```rust
607 /// use std::iter::FromIterator;
608 /// use oni_comb_parser_rs::prelude::*;
609 ///
610 /// let text: &str = "xyz";
611 /// let input = text.chars().collect::<Vec<_>>();
612 ///
613 /// let parser: Parser<char, String> = none_of("abc").of_many1().map(String::from_iter);
614 ///
615 /// let result: ParseResult<char, String> = parser.parse(&input);
616 ///
617 /// assert!(result.is_success());
618 /// assert_eq!(result.success().unwrap(), text);
619 /// ```
620 pub fn none_of<'a, I, S>(set: &'static S) -> Parser<'a, I, I>
621 where
622 I: Element,
623 S: Set<I> + ?Sized + 'static, {
624 ParsersImpl::none_of(set)
625 }
626
627 /// Returns a [Parser] that parses the space (' ', '\t'). (for reference)
628 ///
629 /// # Example
630 ///
631 /// ```rust
632 /// use std::iter::FromIterator;
633 /// use oni_comb_parser_rs::prelude::*;
634 ///
635 /// let text: &str = " ";
636 /// let input = text.chars().collect::<Vec<_>>();
637 ///
638 /// let parser: Parser<char, String> = elm_space_ref().of_many1().map(String::from_iter);
639 ///
640 /// let result: ParseResult<char, String> = parser.parse(&input);
641 ///
642 /// assert!(result.is_success());
643 /// assert_eq!(result.success().unwrap(), text);
644 /// ```
645 pub fn elm_space_ref<'a, I>() -> Parser<'a, I, &'a I>
646 where
647 I: Element, {
648 ParsersImpl::elm_space_ref()
649 }
650
651 /// Returns a [Parser] that parses the space (' ', '\t').
652 ///
653 /// # Example
654 ///
655 /// ```rust
656 /// use std::iter::FromIterator;
657 /// use oni_comb_parser_rs::prelude::*;
658 ///
659 /// let text: &str = " ";
660 /// let input = text.chars().collect::<Vec<_>>();
661 ///
662 /// let parser: Parser<char, String> = elm_space().of_many1().map(String::from_iter);
663 ///
664 /// let result: ParseResult<char, String> = parser.parse(&input);
665 ///
666 /// assert!(result.is_success());
667 /// assert_eq!(result.success().unwrap(), text);
668 /// ```
669 pub fn elm_space<'a, I>() -> Parser<'a, I, I>
670 where
671 I: Element, {
672 ParsersImpl::elm_space()
673 }
674
675 /// Returns a [Parser] that parses spaces containing newlines (' ', '\t', '\n', '\r'). (for reference)
676 ///
677 /// # Example
678 ///
679 /// ```rust
680 /// use std::iter::FromIterator;
681 /// use oni_comb_parser_rs::prelude::*;
682 ///
683 /// let text: &str = " \n ";
684 /// let input = text.chars().collect::<Vec<_>>();
685 ///
686 /// let parser: Parser<char, String> = elm_multi_space_ref().of_many1().map(String::from_iter);
687 ///
688 /// let result: ParseResult<char, String> = parser.parse(&input);
689 ///
690 /// assert!(result.is_success());
691 /// assert_eq!(result.success().unwrap(), text);
692 /// ```
693 pub fn elm_multi_space_ref<'a, I>() -> Parser<'a, I, &'a I>
694 where
695 I: Element, {
696 ParsersImpl::elm_multi_space_ref()
697 }
698
699 /// Returns a [Parser] that parses spaces containing newlines (' ', '\t', '\n', '\r').
700 ///
701 /// # Example
702 ///
703 /// ```rust
704 /// use std::iter::FromIterator;
705 /// use oni_comb_parser_rs::prelude::*;
706 ///
707 /// let text: &str = " \n ";
708 /// let input = text.chars().collect::<Vec<_>>();
709 ///
710 /// let parser: Parser<char, String> = elm_multi_space().of_many1().map(String::from_iter);
711 ///
712 /// let result: ParseResult<char, String> = parser.parse(&input);
713 ///
714 /// assert!(result.is_success());
715 /// assert_eq!(result.success().unwrap(), text);
716 /// ```
717 pub fn elm_multi_space<'a, I>() -> Parser<'a, I, I>
718 where
719 I: Element, {
720 ParsersImpl::elm_multi_space()
721 }
722
723 /// Returns a [Parser] that parses alphabets ('A'..='Z', 'a'..='z').(for reference)
724 ///
725 /// # Example
726 ///
727 /// ```rust
728 /// use std::iter::FromIterator;
729 /// use oni_comb_parser_rs::prelude::*;
730 ///
731 /// let text: &str = "abcxyz";
732 /// let input = text.chars().collect::<Vec<_>>();
733 ///
734 /// let parser: Parser<char, String> = elm_alpha_ref().of_many1().map(String::from_iter);
735 ///
736 /// let result: ParseResult<char, String> = parser.parse(&input);
737 ///
738 /// assert!(result.is_success());
739 /// assert_eq!(result.success().unwrap(), text);
740 /// ```
741 pub fn elm_alpha_ref<'a, I>() -> Parser<'a, I, &'a I>
742 where
743 I: Element, {
744 ParsersImpl::elm_alpha_ref()
745 }
746
747 /// Returns a [Parser] that parses alphabets ('A'..='Z', 'a'..='z').
748 ///
749 /// # Example
750 ///
751 /// ```rust
752 /// use std::iter::FromIterator;
753 /// use oni_comb_parser_rs::prelude::*;
754 ///
755 /// let text: &str = "abcxyz";
756 /// let input = text.chars().collect::<Vec<_>>();
757 ///
758 /// let parser: Parser<char, String> = elm_alpha().of_many1().map(String::from_iter);
759 ///
760 /// let result: ParseResult<char, String> = parser.parse(&input);
761 ///
762 /// assert!(result.is_success());
763 /// assert_eq!(result.success().unwrap(), text);
764 /// ```
765 pub fn elm_alpha<'a, I>() -> Parser<'a, I, I>
766 where
767 I: Element, {
768 ParsersImpl::elm_alpha()
769 }
770
771 /// Returns a [Parser] that parses alphabets and digits ('0'..='9', 'A'..='Z', 'a'..='z').(for reference)
772 ///
773 /// # Example
774 ///
775 /// ```rust
776 /// use std::iter::FromIterator;
777 /// use oni_comb_parser_rs::prelude::*;
778 ///
779 /// let text: &str = "abc0123xyz";
780 /// let input = text.chars().collect::<Vec<_>>();
781 ///
782 /// let parser: Parser<char, String> = elm_alpha_digit_ref().of_many1().map(String::from_iter);
783 ///
784 /// let result: ParseResult<char, String> = parser.parse(&input);
785 ///
786 /// assert!(result.is_success());
787 /// assert_eq!(result.success().unwrap(), text);
788 /// ```
789 pub fn elm_alpha_digit_ref<'a, I>() -> Parser<'a, I, &'a I>
790 where
791 I: Element, {
792 ParsersImpl::elm_alpha_digit_ref()
793 }
794
795 /// Returns a [Parser] that parses alphabets and digits ('0'..='9', 'A'..='Z', 'a'..='z').
796 ///
797 /// # Example
798 ///
799 /// ```rust
800 /// use std::iter::FromIterator;
801 /// use oni_comb_parser_rs::prelude::*;
802 ///
803 /// let text: &str = "abc0123xyz";
804 /// let input = text.chars().collect::<Vec<_>>();
805 ///
806 /// let parser: Parser<char, String> = elm_alpha_digit().of_many1().map(String::from_iter);
807 ///
808 /// let result: ParseResult<char, String> = parser.parse(&input);
809 ///
810 /// assert!(result.is_success());
811 /// assert_eq!(result.success().unwrap(), text);
812 /// ```
813 pub fn elm_alpha_digit<'a, I>() -> Parser<'a, I, I>
814 where
815 I: Element, {
816 ParsersImpl::elm_alpha_digit()
817 }
818
819 /// Returns a [Parser] that parses digits ('0'..='9').(for reference)
820 ///
821 /// # Example
822 ///
823 /// ```rust
824 /// use std::iter::FromIterator;
825 /// use oni_comb_parser_rs::prelude::*;
826 ///
827 /// let text: &str = "0123456789";
828 /// let input = text.chars().collect::<Vec<_>>();
829 ///
830 /// let parser: Parser<char, String> = elm_digit_ref().of_many1().map(String::from_iter);
831 ///
832 /// let result: ParseResult<char, String> = parser.parse(&input);
833 ///
834 /// assert!(result.is_success());
835 /// assert_eq!(result.success().unwrap(), text);
836 /// ```
837 pub fn elm_digit_ref<'a, I>() -> Parser<'a, I, &'a I>
838 where
839 I: Element, {
840 ParsersImpl::elm_digit_ref()
841 }
842
843 /// Returns a [Parser] that parses digits ('0'..='9').
844 ///
845 /// # Example
846 ///
847 /// ```rust
848 /// use std::iter::FromIterator;
849 /// use oni_comb_parser_rs::prelude::*;
850 ///
851 /// let text: &str = "0123456789";
852 /// let input = text.chars().collect::<Vec<_>>();
853 ///
854 /// let parser: Parser<char, String> = elm_digit().of_many1().map(String::from_iter);
855 ///
856 /// let result: ParseResult<char, String> = parser.parse(&input);
857 ///
858 /// assert!(result.is_success());
859 /// assert_eq!(result.success().unwrap(), text);
860 /// ```
861 pub fn elm_digit<'a, I>() -> Parser<'a, I, I>
862 where
863 I: Element, {
864 ParsersImpl::elm_digit()
865 }
866
867 /// Returns a [Parser] that parses digits ('1'..='9').(for reference)<br/>
868 /// 数字('1'..='9')を解析する[Parser]を返します。(参照版)
869 ///
870 /// # Example
871 ///
872 /// ```rust
873 /// # use std::iter::FromIterator;
874 /// # use oni_comb_parser_rs::prelude::*;
875 ///
876 /// let text: &str = "123456789";
877 /// let input = text.chars().collect::<Vec<_>>();
878 ///
879 /// let parser: Parser<char, String> = elm_digit().of_many1().map(String::from_iter);
880 ///
881 /// let result: ParseResult<char, String> = parser.parse(&input);
882 ///
883 /// assert!(result.is_success());
884 /// assert_eq!(result.success().unwrap(), text);
885 /// ```
886 pub fn elm_digit_1_9_ref<'a, I>() -> Parser<'a, I, &'a I>
887 where
888 I: Element, {
889 elm_digit_ref().with_filter_not(|c: &&I| c.is_ascii_digit_zero())
890 }
891
892 /// Returns a [Parser] that parses digits ('1'..='9').
893 ///
894 /// # Example
895 ///
896 /// ```rust
897 /// use std::iter::FromIterator;
898 /// use oni_comb_parser_rs::prelude::*;
899 ///
900 /// let text: &str = "123456789";
901 /// let input = text.chars().collect::<Vec<_>>();
902 ///
903 /// let parser: Parser<char, String> = elm_digit_1_9().of_many1().map(String::from_iter);
904 ///
905 /// let result: ParseResult<char, String> = parser.parse(&input);
906 ///
907 /// assert!(result.is_success());
908 /// assert_eq!(result.success().unwrap(), text);
909 /// ```
910 pub fn elm_digit_1_9<'a, I>() -> Parser<'a, I, I>
911 where
912 I: Element, {
913 elm_digit_1_9_ref().map(Clone::clone)
914 }
915
916 /// Returns a [Parser] that parses hex digits ('0'..='9', 'A'..='F', 'a'..='f').(for reference)
917 ///
918 /// # Example
919 ///
920 /// ```rust
921 /// use std::iter::FromIterator;
922 /// use oni_comb_parser_rs::prelude::*;
923 ///
924 /// let text: &str = "0123456789ABCDEFabcdef";
925 /// let input = text.chars().collect::<Vec<_>>();
926 ///
927 /// let parser: Parser<char, String> = elm_hex_digit_ref().of_many1().map(String::from_iter);
928 ///
929 /// let result: ParseResult<char, String> = parser.parse(&input);
930 ///
931 /// assert!(result.is_success());
932 /// assert_eq!(result.success().unwrap(), text);
933 /// ```
934 pub fn elm_hex_digit_ref<'a, I>() -> Parser<'a, I, &'a I>
935 where
936 I: Element, {
937 ParsersImpl::elm_hex_digit_ref()
938 }
939
940 /// Returns a [Parser] that parses hex digits ('0'..='9', 'A'..='F', 'a'..='f').
941 ///
942 /// # Example
943 ///
944 /// ```rust
945 /// use std::iter::FromIterator;
946 /// use oni_comb_parser_rs::prelude::*;
947 ///
948 /// let text: &str = "0123456789ABCDEFabcdef";
949 /// let input = text.chars().collect::<Vec<_>>();
950 ///
951 /// let parser: Parser<char, String> = elm_hex_digit().of_many1().map(String::from_iter);
952 ///
953 /// let result: ParseResult<char, String> = parser.parse(&input);
954 ///
955 /// assert!(result.is_success());
956 /// assert_eq!(result.success().unwrap(), text);
957 /// ```
958 pub fn elm_hex_digit<'a, I>() -> Parser<'a, I, I>
959 where
960 I: Element, {
961 ParsersImpl::elm_hex_digit()
962 }
963
964 /// Returns a [Parser] that parses oct digits ('0'..='8').(for reference)
965 ///
966 /// # Example
967 ///
968 /// ```rust
969 /// use std::iter::FromIterator;
970 /// use oni_comb_parser_rs::prelude::*;
971 ///
972 /// let text: &str = "012345678";
973 /// let input = text.chars().collect::<Vec<_>>();
974 ///
975 /// let parser: Parser<char, String> = elm_oct_digit_ref().of_many1().map(String::from_iter);
976 ///
977 /// let result: ParseResult<char, String> = parser.parse(&input);
978 ///
979 /// assert!(result.is_success());
980 /// assert_eq!(result.success().unwrap(), text);
981 /// ```
982 pub fn elm_oct_digit_ref<'a, I>() -> Parser<'a, I, &'a I>
983 where
984 I: Element, {
985 ParsersImpl::elm_oct_digit_ref()
986 }
987
988 /// Returns a [Parser] that parses oct digits ('0'..='8').
989 ///
990 /// # Example
991 ///
992 /// ```rust
993 /// use std::iter::FromIterator;
994 /// use oni_comb_parser_rs::prelude::*;
995 ///
996 /// let text: &str = "012345678";
997 /// let input = text.chars().collect::<Vec<_>>();
998 ///
999 /// let parser: Parser<char, String> = elm_oct_digit().of_many1().map(String::from_iter);
1000 ///
1001 /// let result: ParseResult<char, String> = parser.parse(&input);
1002 ///
1003 /// assert!(result.is_success());
1004 /// assert_eq!(result.success().unwrap(), text);
1005 /// ```
1006 pub fn elm_oct_digit<'a, I>() -> Parser<'a, I, I>
1007 where
1008 I: Element, {
1009 ParsersImpl::elm_oct_digit()
1010 }
1011
1012 // --- Elements Parsers ---
1013
1014 /// Returns a [Parser] that parses a sequence of elements.
1015 ///
1016 /// # Example
1017 ///
1018 /// ```rust
1019 /// use std::iter::FromIterator;
1020 /// use oni_comb_parser_rs::prelude::*;
1021 ///
1022 /// let text: &str = "abc";
1023 /// let input = text.as_bytes();
1024 ///
1025 /// let parser: Parser<u8, &str> = seq(b"abc").collect().map_res(std::str::from_utf8);
1026 ///
1027 /// let result: ParseResult<u8, &str> = parser.parse(input);
1028 ///
1029 /// assert!(result.is_success());
1030 /// assert_eq!(result.success().unwrap(), text);
1031 /// ```
1032 pub fn seq<'a, 'b, I>(seq: &'b [I]) -> Parser<'a, I, Vec<I>>
1033 where
1034 I: Element,
1035 'b: 'a, {
1036 ParsersImpl::seq(seq)
1037 }
1038
1039 /// Returns a [Parser] that parses a string.
1040 ///
1041 /// - tag: a string
1042 /// - tag: 文字列
1043 ///
1044 /// # Example
1045 ///
1046 /// ```rust
1047 /// use oni_comb_parser_rs::prelude::*;
1048 ///
1049 /// let text: &str = "abcdef";
1050 /// let input = text.chars().collect::<Vec<_>>();
1051 ///
1052 /// let parser: Parser<char, String> = tag("abc");
1053 ///
1054 /// let result: ParseResult<char, String> = parser.parse(&input);
1055 ///
1056 /// assert!(result.is_success());
1057 /// assert_eq!(result.success().unwrap(), "abc");
1058 /// ```
1059 pub fn tag<'a, 'b>(tag: &'b str) -> Parser<'a, char, String>
1060 where
1061 'b: 'a, {
1062 ParsersImpl::tag(tag)
1063 }
1064
1065 /// Returns a [Parser] that parses a string. However, it is not case-sensitive.
1066 ///
1067 /// - tag: a string
1068 /// - tag: 文字列
1069 ///
1070 /// # Example
1071 ///
1072 /// ```rust
1073 /// use oni_comb_parser_rs::prelude::*;
1074 ///
1075 /// let text: &str = "abcdef";
1076 /// let input = text.chars().collect::<Vec<_>>();
1077 ///
1078 /// let parser: Parser<char, String> = tag("abc");
1079 ///
1080 /// let result: ParseResult<char, String> = parser.parse(&input);
1081 ///
1082 /// assert!(result.is_success());
1083 /// assert_eq!(result.success().unwrap(), "abc");
1084 /// ```
1085 pub fn tag_no_case<'a, 'b>(tag: &'b str) -> Parser<'a, char, String>
1086 where
1087 'b: 'a, {
1088 ParsersImpl::tag_no_case(tag)
1089 }
1090
1091 /// Returns a [Parser] that parses a string that match a regular expression.
1092 ///
1093 /// - pattern: a regular expression
1094 /// - pattern: 正規表現
1095 ///
1096 /// # Example
1097 ///
1098 /// ```rust
1099 /// # use oni_comb_parser_rs::prelude::*;
1100 ///
1101 /// let text: &str = "abcdef";
1102 /// let input = text.chars().collect::<Vec<_>>();
1103 ///
1104 /// let parser: Parser<char, String> = regex("[abc]+");
1105 ///
1106 /// let result: ParseResult<char, String> = parser.parse(&input);
1107 ///
1108 /// assert!(result.is_success());
1109 /// assert_eq!(result.success().unwrap(), "abc");
1110 /// ```
1111 pub fn regex<'a>(pattern: &str) -> Parser<'a, char, String> {
1112 ParsersImpl::regex(pattern)
1113 }
1114
1115 /// Returns a [Parser] that returns an element of the specified length.
1116 ///
1117 /// - n: Length of the reading element
1118 /// - n: 読む要素の長さ
1119 ///
1120 /// # Example
1121 ///
1122 /// ```rust
1123 /// use std::iter::FromIterator;
1124 /// use oni_comb_parser_rs::prelude::*;
1125 ///
1126 /// let text: &str = "abcdef";
1127 /// let input = text.chars().collect::<Vec<_>>();
1128 ///
1129 /// let parser: Parser<char, String> = take(3).map(String::from_iter);
1130 ///
1131 /// let result: ParseResult<char, String> = parser.parse(&input);
1132 ///
1133 /// assert!(result.is_success());
1134 /// assert_eq!(result.success().unwrap(), "abc");
1135 /// ```
1136 pub fn take<'a, I>(n: usize) -> Parser<'a, I, &'a [I]>
1137 where
1138 I: Element, {
1139 ParsersImpl::take(n)
1140 }
1141
1142 /// Returns a [Parser] that returns elements, while the result of the closure is true.
1143 ///
1144 /// The length of the analysis result is not required.
1145 ///
1146 /// # Example
1147 ///
1148 /// ```rust
1149 /// use std::iter::FromIterator;
1150 /// use oni_comb_parser_rs::prelude::*;
1151 ///
1152 /// let text: &str = "abcdef";
1153 /// let input = text.chars().collect::<Vec<_>>();
1154 ///
1155 /// let parser: Parser<char, String> = take_while0(|e| match *e {
1156 /// 'a'..='c' => true,
1157 /// _ => false
1158 /// }).map(String::from_iter);
1159 ///
1160 /// let result: ParseResult<char, String> = parser.parse(&input);
1161 ///
1162 /// assert!(result.is_success());
1163 /// assert_eq!(result.success().unwrap(), "abc");
1164 /// ```
1165 pub fn take_while0<'a, I, F>(f: F) -> Parser<'a, I, &'a [I]>
1166 where
1167 F: Fn(&I) -> bool + 'a,
1168 I: Element, {
1169 ParsersImpl::take_while0(f)
1170 }
1171
1172 /// Returns a [Parser] that returns elements, while the result of the closure is true.
1173 ///
1174 /// The length of the analysis result must be at least one element.
1175 ///
1176 /// # Example
1177 ///
1178 /// ```rust
1179 /// # use std::iter::FromIterator;
1180 /// # use oni_comb_parser_rs::prelude::*;
1181 ///
1182 /// let text: &str = "abcdef";
1183 /// let input = text.chars().collect::<Vec<_>>();
1184 ///
1185 /// let parser: Parser<char, String> = take_while1(|e| match *e {
1186 /// 'a'..='c' => true,
1187 /// _ => false
1188 /// }).map(String::from_iter);
1189 ///
1190 /// let result: ParseResult<char, String> = parser.parse(&input);
1191 ///
1192 /// assert!(result.is_success());
1193 /// assert_eq!(result.success().unwrap(), "abc");
1194 /// ```
1195 pub fn take_while1<'a, I, F>(f: F) -> Parser<'a, I, &'a [I]>
1196 where
1197 F: Fn(&I) -> bool + 'a,
1198 I: Element, {
1199 ParsersImpl::take_while1(f)
1200 }
1201
1202 /// Returns a [Parser] that returns elements, while the result of the closure is true.
1203 ///
1204 /// The length of the analysis result should be between n and m elements.
1205 ///
1206 /// # Example
1207 ///
1208 /// ```rust
1209 /// use std::iter::FromIterator;
1210 /// use oni_comb_parser_rs::prelude::*;
1211 ///
1212 /// let text: &str = "abcdef";
1213 /// let input = text.chars().collect::<Vec<_>>();
1214 ///
1215 /// let parser: Parser<char, String> = take_while_n_m(1, 3, |e| match *e {
1216 /// 'a'..='c' => true,
1217 /// _ => false
1218 /// }).map(String::from_iter);
1219 ///
1220 /// let result: ParseResult<char, String> = parser.parse(&input);
1221 ///
1222 /// assert!(result.is_success());
1223 /// assert_eq!(result.success().unwrap(), "abc");
1224 /// ```
1225 pub fn take_while_n_m<'a, I, F>(n: usize, m: usize, f: F) -> Parser<'a, I, &'a [I]>
1226 where
1227 F: Fn(&I) -> bool + 'a,
1228 I: Element, {
1229 ParsersImpl::take_while_n_m(n, m, f)
1230 }
1231
1232 /// Returns a [Parser] that returns a sequence up to either the end element or the element that matches the condition.
1233 ///
1234 /// The length of the analysis result must be at least one element.
1235 ///
1236 /// # Example
1237 ///
1238 /// ```rust
1239 /// use std::iter::FromIterator;
1240 /// use oni_comb_parser_rs::prelude::*;
1241 ///
1242 /// let text: &str = "abcdef";
1243 /// let input = text.chars().collect::<Vec<_>>();
1244 ///
1245 /// let parser: Parser<char, String> = take_till0(|e| matches!(*e, 'c')).map(String::from_iter);
1246 ///
1247 /// let result: ParseResult<char, String> = parser.parse(&input);
1248 ///
1249 /// assert!(result.is_success());
1250 /// assert_eq!(result.success().unwrap(), "abc");
1251 /// ```
1252 pub fn take_till0<'a, I, F>(f: F) -> Parser<'a, I, &'a [I]>
1253 where
1254 F: Fn(&I) -> bool + 'a,
1255 I: Element, {
1256 ParsersImpl::take_till0(f)
1257 }
1258
1259 /// Returns a [Parser] that returns a sequence up to either the end element or the element that matches the condition.
1260 ///
1261 /// The length of the analysis result must be at least one element.
1262 ///
1263 /// # Example
1264 ///
1265 /// ```rust
1266 /// use std::iter::FromIterator;
1267 /// use oni_comb_parser_rs::prelude::*;
1268 ///
1269 /// let text: &str = "abcdef";
1270 /// let input = text.chars().collect::<Vec<_>>();
1271 ///
1272 /// let parser = take_till1(|e| matches!(*e, 'c')).map(String::from_iter);
1273 ///
1274 /// let result = parser.parse(&input);
1275 ///
1276 /// assert!(result.is_success());
1277 /// assert_eq!(result.success().unwrap(), "abc");
1278 /// ```
1279 pub fn take_till1<'a, I, F>(f: F) -> Parser<'a, I, &'a [I]>
1280 where
1281 F: Fn(&I) -> bool + 'a,
1282 I: Element, {
1283 ParsersImpl::take_till1(f)
1284 }
1285
1286 // --- Offset Control Parsers ---
1287
1288 /// Returns a [Parser] that skips the specified number of elements.
1289 ///
1290 /// - size: a size of elements
1291 ///
1292 /// # Example
1293 ///
1294 /// ```rust
1295 /// use std::iter::FromIterator;
1296 /// use oni_comb_parser_rs::prelude::*;
1297 ///
1298 /// let text: &str = "abcdef";
1299 /// let input = text.chars().collect::<Vec<_>>();
1300 ///
1301 /// let parser: Parser<char, String> = (skip(3) * tag("def"));
1302 ///
1303 /// let result: ParseResult<char, String> = parser.parse(&input);
1304 ///
1305 /// assert!(result.is_success());
1306 /// assert_eq!(result.success().unwrap(), "def");
1307 /// ```
1308 pub fn skip<'a, I>(n: usize) -> Parser<'a, I, ()> {
1309 ParsersImpl::skip(n)
1310 }
1311
1312 // --- Enhanced Parsers ---
1313
1314 /// Return a [Parser] that skips the previous and following [Parser]s.
1315 ///
1316 /// - lp: left parser
1317 /// - parser: central parser
1318 /// - rp: right parser
1319 ///
1320 /// # Example
1321 ///
1322 /// ```rust
1323 /// use std::iter::FromIterator;
1324 /// use oni_comb_parser_rs::prelude::*;
1325 ///
1326 /// let text: &str = "(abc)";
1327 /// let input = text.chars().collect::<Vec<_>>();
1328 ///
1329 /// let parser: Parser<char, String> = surround(elm('('), tag("abc"), elm(')'));
1330 ///
1331 /// let result: ParseResult<char, String> = parser.parse(&input);
1332 ///
1333 /// assert!(result.is_success());
1334 /// assert_eq!(result.success().unwrap(), "abc");
1335 /// ```
1336 pub fn surround<'a, I, A, B, C>(
1337 lp: Parser<'a, I, A>,
1338 parser: Parser<'a, I, B>,
1339 rp: Parser<'a, I, C>,
1340 ) -> Parser<'a, I, B>
1341 where
1342 A: Clone + Debug + 'a,
1343 B: Clone + Debug + 'a,
1344 C: Clone + Debug + 'a, {
1345 ParsersImpl::surround(lp, parser, rp)
1346 }
1347
1348 /// Returns a [Parser] that lazily evaluates the specified [Parser].
1349 ///
1350 /// - f: Function to generate parser
1351 ///
1352 /// # Example
1353 ///
1354 /// ```rust
1355 /// use std::iter::FromIterator;
1356 /// use oni_comb_parser_rs::prelude::*;
1357 ///
1358 /// let text: &str = "abc";
1359 /// let input = text.chars().collect::<Vec<_>>();
1360 ///
1361 /// fn value<'a>() -> Parser<'a, char, String> {
1362 /// tag("abc")
1363 /// }
1364 /// let parser: Parser<char, String> = lazy(value);
1365 ///
1366 /// let result: ParseResult<char, String> = parser.parse(&input);
1367 ///
1368 /// assert!(result.is_success());
1369 /// assert_eq!(result.success().unwrap(), "abc");
1370 /// ```
1371 pub fn lazy<'a, I, A, F>(f: F) -> Parser<'a, I, A>
1372 where
1373 F: Fn() -> Parser<'a, I, A> + 'a + Clone,
1374 A: Clone + Debug + 'a, {
1375 ParsersImpl::lazy(f)
1376 }
1377}
1378
1379#[cfg(test)]
1380mod tests {
1381 use std::env;
1382 use std::iter::FromIterator;
1383
1384 use crate::core::{ParserFunctor, ParserMonad, ParserRunner};
1385
1386 use crate::extension::parser::{
1387 CollectParser, ConversionParser, DiscardParser, LoggingParser, OffsetParser, OperatorParser, PeekParser,
1388 RepeatParser,
1389 };
1390
1391 use super::prelude::*;
1392
1393 fn init() {
1394 env::set_var("RUST_LOG", "debug");
1395 let _ = env_logger::builder().is_test(true).try_init();
1396 }
1397
1398 #[test]
1399 fn test_attempt() {
1400 init();
1401 {
1402 let input1 = b"b";
1403 let p: Parser<u8, &u8> = failed_with_commit(ParseError::of_in_complete())
1404 .attempt()
1405 .or(elm_ref(b'b'));
1406
1407 let r = p.parse_as_result(input1);
1408 assert!(r.is_ok());
1409 }
1410
1411 {
1412 let input1 = "abra cadabra!".chars().collect::<Vec<char>>();
1413 let p = (tag("abra") + elm_space() + tag("abra")).attempt() | (tag("abra") + elm_space() + tag("cadabra!"));
1414 let r = p.parse_as_result(&input1);
1415 println!("result = {:?}", r);
1416 assert!(r.is_ok());
1417 }
1418 }
1419
1420 #[test]
1421 fn test_successful_in_closure() {
1422 init();
1423 let input = b"a";
1424 let p = successful_lazy(|| 'a');
1425
1426 let r = p.parse_as_result(input).unwrap();
1427 assert_eq!(r, 'a');
1428 }
1429
1430 #[test]
1431 fn test_elem() {
1432 init();
1433 let p = elm(b'a');
1434
1435 let r = p.parse_as_result(b"a").unwrap();
1436 assert_eq!(r, b'a');
1437 }
1438
1439 #[test]
1440 fn test_regex() {
1441 init();
1442 let input1 = "abc".chars().collect::<Vec<char>>();
1443 let input2 = "xbc".chars().collect::<Vec<char>>();
1444 let p = regex(r"a.*c$").name("regex_1");
1445
1446 let r = p.parse_as_result(&input1);
1447 assert!(r.is_ok());
1448 assert_eq!(r.unwrap(), "abc");
1449
1450 let r = p.parse_as_result(&input2);
1451 assert!(r.is_err());
1452 println!("{}", r.err().unwrap());
1453
1454 {
1455 let input3 = "12345 to".chars().collect::<Vec<_>>();
1456 let p = regex(r"\d+");
1457 let r = p.parse_as_result(&input3);
1458 println!("{:?}", r);
1459 assert!(r.is_ok());
1460 // assert_eq!(r.unwrap(), "abc");
1461 }
1462 }
1463
1464 #[test]
1465 fn test_elm_of() {
1466 init();
1467 let patterns = b'a'..=b'f';
1468 let patterns_static: &'static _ = Box::leak(Box::new(patterns.clone()));
1469 let e = patterns.clone();
1470 let b = e.enumerate().into_iter().map(|e| e.1).collect::<Vec<_>>();
1471 let p = elm_of(patterns_static);
1472
1473 for index in 0..b.len() {
1474 let r = p.parse_as_result(&b[index..]);
1475 assert!(r.is_ok());
1476 assert_eq!(r.unwrap(), b[index]);
1477 }
1478
1479 let r = p.parse_as_result(b"g");
1480 assert!(r.is_err());
1481 }
1482
1483 #[test]
1484 fn test_none_of() {
1485 init();
1486 let patterns = b'a'..=b'f';
1487 let patterns_static: &'static _ = Box::leak(Box::new(patterns.clone()));
1488 let e = patterns.clone();
1489 let b = e.enumerate().into_iter().map(|e| e.1).collect::<Vec<_>>();
1490 let p = none_of(patterns_static);
1491
1492 for index in 0..b.len() {
1493 let r = p.parse_as_result(&b[index..]);
1494 assert!(r.is_err());
1495 }
1496
1497 let r = p.parse_as_result(b"g");
1498 assert!(r.is_ok());
1499 assert_eq!(r.unwrap(), b'g');
1500 }
1501
1502 #[test]
1503 fn test_peek() {
1504 init();
1505
1506 let input = "aname".chars().collect::<Vec<char>>();
1507 let p = elm_ref('a').peek() + tag("aname");
1508
1509 let result = p.parse_as_result(&input).unwrap();
1510
1511 log::debug!("result = {:?}", result);
1512 assert_eq!(*result.0, 'a');
1513 assert_eq!(result.1, "aname");
1514 }
1515
1516 #[test]
1517 fn test_repeat() {
1518 init();
1519 let p = elm_ref(b'a').repeat(..=3).collect();
1520
1521 let r = p.parse_as_result(b"");
1522 assert!(r.is_ok());
1523
1524 let r = p.parse_as_result(b"a").unwrap();
1525 assert_eq!(r, vec![b'a']);
1526
1527 let r = p.parse_as_result(b"aa").unwrap();
1528 assert_eq!(r, vec![b'a', b'a']);
1529
1530 let r = p.parse_as_result(b"aaa").unwrap();
1531 assert_eq!(r, vec![b'a', b'a', b'a']);
1532 }
1533
1534 #[test]
1535 fn test_many_0() {
1536 init();
1537 let p = elm_ref(b'a').of_many0().collect();
1538
1539 // let r = p.parse(b"").unwrap();
1540 // assert_eq!(r, vec![]);
1541
1542 let r = p.parse_as_result(b"a").unwrap();
1543 assert_eq!(r, vec![b'a']);
1544
1545 let r = p.parse_as_result(b"aa").unwrap();
1546 assert_eq!(r, vec![b'a', b'a']);
1547 }
1548
1549 #[test]
1550 fn test_many_1() {
1551 init();
1552 let p = elm_ref(b'a').of_many1().collect();
1553
1554 let r = p.parse_as_result(b"");
1555 assert!(r.is_err());
1556
1557 let r = p.parse_as_result(b"a").unwrap();
1558 assert_eq!(r, vec![b'a']);
1559
1560 let r = p.parse_as_result(b"aa").unwrap();
1561 assert_eq!(r, vec![b'a', b'a']);
1562 }
1563
1564 #[test]
1565 fn test_many_n_m() {
1566 init();
1567 let p = elm_ref(b'a').of_many_n_m(1, 2).collect() + end();
1568
1569 let r = p.parse_as_result(b"");
1570 assert!(r.is_err());
1571
1572 let (a, _) = p.parse_as_result(b"a").unwrap();
1573 assert_eq!(a, vec![b'a']);
1574
1575 let (a, _) = p.parse_as_result(b"aa").unwrap();
1576 assert_eq!(a, vec![b'a', b'a']);
1577
1578 let r = p.parse_as_result(b"aaa");
1579 assert!(r.is_err());
1580 }
1581
1582 #[test]
1583 fn test_count_sep() {
1584 init();
1585 let p1 = elm_ref(b'a');
1586 let p2 = elm_ref(b',');
1587 let p = p1.map(|e| *e).of_count_sep(3, p2);
1588
1589 let r = p.parse_as_result(b"a,a,a").unwrap();
1590 assert_eq!(r, vec![b'a', b'a', b'a']);
1591 }
1592
1593 #[test]
1594 fn test_seq() {
1595 init();
1596 let p = seq(b"abc");
1597
1598 let r = p.parse_as_result(b"abc").unwrap();
1599 assert_eq!(r, b"abc");
1600 }
1601
1602 #[test]
1603 fn test_tag() {
1604 init();
1605 let input = "abe".chars().collect::<Vec<char>>();
1606 let p = tag("abc").attempt() | tag("abe");
1607
1608 let r = p.parse(&input);
1609 println!("{:?}", r);
1610 assert_eq!(r.to_result().unwrap(), "abe");
1611 }
1612
1613 #[test]
1614 fn test_tag_no_case() {
1615 init();
1616 let input = "AbC".chars().collect::<Vec<char>>();
1617 let p = tag_no_case("abc");
1618
1619 let r = p.parse_as_result(&input).unwrap();
1620 assert_eq!(r, "abc");
1621 }
1622
1623 #[test]
1624 fn test_opt() {
1625 init();
1626 let p = seq(b"abc").opt();
1627
1628 if let Some(b) = p.parse_as_result(b"abc").unwrap() {
1629 assert_eq!(b, b"abc");
1630 } else {
1631 panic!()
1632 }
1633 }
1634
1635 #[test]
1636 fn test_not() {
1637 init();
1638 let p = seq(b"abc").not();
1639
1640 let _ = p.parse_as_result(b"def").unwrap();
1641 }
1642
1643 #[test]
1644 fn test_take() {
1645 init();
1646 let str = "abc";
1647 let str_len = str.len();
1648 let mut input = vec![str_len as u8];
1649 input.extend_from_slice(str.as_bytes());
1650
1651 // input: [u8; N] = [ data size as u8 | data bytes ----- ]
1652
1653 let bytes_parser: Parser<u8, &[u8]> = take(1).flat_map(|size: &[u8]| take(size[0] as usize));
1654
1655 let ss = bytes_parser
1656 .parse(&input)
1657 .to_result()
1658 .map(|r| std::str::from_utf8(r).unwrap())
1659 .unwrap();
1660
1661 println!("{}", ss);
1662 assert_eq!(ss, str);
1663 }
1664
1665 #[test]
1666 fn test_take_2() {
1667 init();
1668 let input1 = "abcd".chars().collect::<Vec<char>>();
1669 let p = ((elm_ref('a') + elm_ref('b')).flat_map(|e| skip(1).map(move |_| e)) + elm_any_ref() + end())
1670 .collect()
1671 .map(|chars| String::from_iter(chars));
1672
1673 let result = p.parse_as_result(&input1).unwrap();
1674 log::debug!("result = {:?}", result);
1675 }
1676
1677 #[test]
1678 fn test_take_while0() {
1679 init();
1680 let p = take_while0(|c: &u8| c.is_ascii_digit()).map_res(std::str::from_utf8);
1681
1682 let result = p.parse_as_result(b"a123b");
1683 assert!(result.is_ok());
1684 assert_eq!(result.unwrap(), "123");
1685
1686 let result = p.parse_as_result(b"def");
1687 assert!(result.is_ok());
1688 }
1689
1690 #[test]
1691 fn test_take_while1() {
1692 init();
1693 let p = take_while1(|c: &u8| c.is_ascii_digit()).map_res(std::str::from_utf8);
1694
1695 let result = p.parse_as_result(b"a123b");
1696 assert!(result.is_ok());
1697 assert_eq!(result.unwrap(), "123");
1698
1699 let result = p.parse_as_result(b"def");
1700 assert!(result.is_err());
1701 }
1702
1703 #[test]
1704 fn test_take_while_n_m() {
1705 init();
1706 let p = take_while_n_m(1, 3, |c: &u8| c.is_ascii_digit()).map_res(std::str::from_utf8);
1707
1708 let result = p.parse_as_result(b"a1b");
1709 assert!(result.is_ok());
1710 assert_eq!(result.unwrap(), "1");
1711
1712 let result = p.parse_as_result(b"a12b");
1713 assert!(result.is_ok());
1714 assert_eq!(result.unwrap(), "12");
1715
1716 let result = p.parse_as_result(b"a123b");
1717 assert!(result.is_ok());
1718 assert_eq!(result.unwrap(), "123");
1719
1720 let result = p.parse_as_result(b"a1234b");
1721 assert!(result.is_err());
1722
1723 let result = p.parse_as_result(b"def");
1724 assert!(result.is_err());
1725 }
1726
1727 #[test]
1728 fn test_take_till0() {
1729 init();
1730 let p = take_till0(|c| *c == b'c').map_res(std::str::from_utf8);
1731
1732 let result = p.parse_as_result(b"abcd");
1733 assert!(result.is_ok());
1734 assert_eq!(result.unwrap(), "abc");
1735
1736 // let result = p.parse_as_result(b"def");
1737 // assert!(result.is_ok());
1738 }
1739
1740 #[test]
1741 fn test_take_till1() {
1742 init();
1743 let p = take_till1(|c| *c == b'c').map_res(std::str::from_utf8);
1744
1745 let result = p.parse_as_result(b"abcd");
1746 assert!(result.is_ok());
1747 assert_eq!(result.unwrap(), "abc");
1748
1749 // let result = p.parse_as_result(b"def");
1750 // assert!(result.is_err());
1751 }
1752
1753 #[test]
1754 fn test_discard() {
1755 init();
1756 let p = seq(b"abc").discard();
1757
1758 let result = p.parse_as_result(b"abc");
1759 assert!(result.is_ok());
1760
1761 let result = p.parse_as_result(b"def");
1762 assert!(result.is_err());
1763 }
1764
1765 #[test]
1766 fn test_and_then() {
1767 init();
1768 let pv1 = b'a';
1769 let pv2 = b'b';
1770 let p = elm_ref(pv1) + elm_ref(pv2);
1771
1772 let result = p.parse_as_result(b"ab").unwrap();
1773 log::debug!("result = {:?}", result);
1774 let (a, b) = result;
1775 assert_eq!(*a, pv1);
1776 assert_eq!(*b, pv2);
1777 }
1778
1779 #[test]
1780 fn test_last_offset() {
1781 init();
1782 let pv1 = b'a';
1783 let pv2 = b'b';
1784 let p1 = elm_ref(pv1);
1785 let p2 = elm_ref(pv2);
1786 let p = (p1 + p2).last_offset();
1787
1788 let result = p.parse_as_result(b"ab").unwrap();
1789 log::debug!("result = {:?}", result);
1790 assert_eq!(result, 1);
1791 }
1792
1793 #[test]
1794 fn test_or() {
1795 init();
1796 let pv1 = b'a';
1797 let pv2 = b'b';
1798 let p = elm_ref(pv1) | elm_ref(pv2);
1799
1800 let result = p.parse_as_result(b"ab").unwrap();
1801 log::debug!("result = {:?}", result);
1802 assert_eq!(*result, pv1);
1803
1804 let result = p.parse_as_result(b"ba").unwrap();
1805 log::debug!("result = {:?}", result);
1806 assert_eq!(*result, pv2);
1807 }
1808
1809 #[test]
1810 fn test_skip_left() {
1811 init();
1812 let pv1 = b'a';
1813 let pv2 = b'b';
1814 let p = elm_ref(pv1) * elm_ref(pv2);
1815
1816 let result = p.parse_as_result(b"ab").unwrap();
1817 log::debug!("result = {:?}", result);
1818 assert_eq!(*result, pv2);
1819 }
1820
1821 #[test]
1822 fn test_skip_right() {
1823 init();
1824 let pv1 = b'a';
1825 let pv2 = b'b';
1826 let p1 = elm_ref(pv1);
1827 let p2 = elm_ref(pv2);
1828 let p = p1 - p2;
1829
1830 let result = p.parse_as_result(b"ab").unwrap();
1831 log::debug!("result = {:?}", result);
1832 assert_eq!(*result, pv1);
1833 }
1834
1835 #[test]
1836 fn test_example1() {
1837 init();
1838 let input1 = "abc".chars().collect::<Vec<char>>();
1839 let input2 = "abd".chars().collect::<Vec<char>>();
1840
1841 let pa = elm_ref('a');
1842 let pb = elm_ref('b');
1843 let pc = elm_ref('c');
1844 let pd = elm_ref('d');
1845 let p = (pa + pb + (pc | pd)).map(|((a, b), c)| {
1846 let mut result = String::new();
1847 result.push(*a);
1848 result.push(*b);
1849 result.push(*c);
1850 result
1851 });
1852
1853 let result = p.parse_as_result(&input1).unwrap();
1854 log::debug!("result = {}", result);
1855 assert_eq!(result, "abc");
1856
1857 let result = p.parse_as_result(&input2).unwrap();
1858 log::debug!("result = {}", result);
1859 assert_eq!(result, "abd");
1860 }
1861
1862 #[test]
1863 fn test_example2() {
1864 init();
1865
1866 let input = "aname".chars().collect::<Vec<char>>();
1867 let p = (elm_ref('a') + tag("name")).map(|(a, name_chars)| {
1868 let mut result = String::new();
1869 result.push(*a);
1870 for c in name_chars.chars() {
1871 result.push(c);
1872 }
1873 result
1874 });
1875
1876 let result = p.parse_as_result(&input).unwrap();
1877 // let s: String = result.iter().collect();
1878 log::debug!("result = {:?}", result);
1879 // assert_eq!(s, "aname");
1880 }
1881
1882 #[test]
1883 fn test_filter() {
1884 init();
1885 {
1886 let input: Vec<char> = "abc def".chars().collect::<Vec<char>>();
1887 let p1 = tag("abc") * elm_ref(' ').map(|e| *e).of_many1() - tag("def");
1888 let p2 = p1.with_filter(|chars| chars.len() > 1);
1889 let result: Result<Vec<char>, ParseError<char>> = p2.parse_as_result(&input);
1890 assert!(result.is_err());
1891 }
1892 {
1893 let input: Vec<char> = "abc def".chars().collect::<Vec<char>>();
1894 let p1 = tag("abc") * elm_ref(' ').map(|e| *e).of_many1() - tag("def");
1895 let p2 = p1.with_filter(|chars| chars.len() > 1);
1896 let result: Result<Vec<char>, ParseError<char>> = p2.parse_as_result(&input);
1897 assert!(result.is_ok());
1898 }
1899 }
1900
1901 #[test]
1902 fn test_filter_not() {
1903 init();
1904 {
1905 let input: Vec<char> = "abc def".chars().collect::<Vec<char>>();
1906 let p1 = tag("abc") * elm_ref(' ').map(|e| *e).of_many1() - tag("def");
1907 let p2 = p1.with_filter_not(|chars| chars.len() > 1);
1908 let result: Result<Vec<char>, ParseError<char>> = p2.parse_as_result(&input);
1909 assert!(result.is_ok());
1910 }
1911 {
1912 let input: Vec<char> = "abc def".chars().collect::<Vec<char>>();
1913 let p1 = tag("abc") * elm_ref(' ').map(|e| *e).of_many1() - tag("def");
1914 let p2 = p1.with_filter_not(|chars| chars.len() > 1);
1915 let result: Result<Vec<char>, ParseError<char>> = p2.parse_as_result(&input);
1916 assert!(result.is_err());
1917 }
1918 }
1919}