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}