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