1use crate::{
2 parse::{macros::impl_parse, ParseImpl},
3 Concat, Error, HardError, Result, SourceBase,
4};
5use alloc::vec::Vec;
6use core::{borrow::Borrow, marker::PhantomData, ops::Range};
7
8pub trait Const {
9 type Type;
10 const VALUE: Self::Type;
11}
12
13pub trait Predicate<T, A> {
14 fn is(v: &T, a: &A) -> bool;
15}
16
17pub trait Mapper<T, A> {
18 type Output;
19 fn map(v: T, a: &A) -> Self::Output;
20}
21
22pub struct Define<T>(PhantomData<T>);
23
24impl<T, U: Mapper<T, A>, A> Mapper<T, A> for Define<U> {
25 type Output = U::Output;
26 #[inline(always)]
27 fn map(v: T, a: &A) -> Self::Output {
28 U::map(v, a)
29 }
30}
31
32impl<T, U: Predicate<T, A>, A> Predicate<T, A> for Define<U> {
33 #[inline(always)]
34 fn is(v: &T, arg: &A) -> bool {
35 U::is(v, arg)
36 }
37}
38
39impl<T: Const> Const for Define<T> {
40 type Type = T::Type;
41 const VALUE: Self::Type = T::VALUE;
42}
43
44impl<I, U: ParseImpl<I, A>, A> ParseImpl<I, A> for Define<U> {
45 type Output = U::Output;
46
47 #[inline(always)]
48 fn parse<S: crate::Source<Item = I>>(input: &mut S, arg: &A) -> Result<Self::Output> {
49 U::parse(input, arg)
50 }
51
52 #[cfg(feature = "async")]
53 #[inline(always)]
54 async fn parse_async<S: crate::AsyncSource<Item = I>>(
55 input: &mut S,
56 arg: &A,
57 ) -> Result<Self::Output> {
58 U::parse_async(input, arg).await
59 }
60}
61
62pub struct Is<P>(PhantomData<P>);
63
64impl<I: Clone, P: Predicate<I, A>, A> ParseImpl<I, A> for Is<P> {
65 type Output = (I,);
66 impl_parse!(parse, _await, |input: I, arg: A| {
67 if let Some(item) = _await!(input.read(1))?.first() {
68 if P::is(item, arg) {
69 let item = item.clone();
70 input.consume(1);
71 return Ok((item,));
72 }
73 }
74
75 Err(Error::Mismatch)
76 });
77}
78
79impl<I, P: Predicate<I, A>, A> Predicate<I, A> for Is<P> {
80 #[inline(always)]
81 fn is(v: &I, arg: &A) -> bool {
82 P::is(v, arg)
83 }
84}
85
86pub type A<C> = AnyOf<AsMany<C>>;
87
88pub struct Not<T>(PhantomData<T>);
89
90impl<I, T: Predicate<I, A>, A> Predicate<I, A> for Not<T> {
91 #[inline(always)]
92 fn is(v: &I, arg: &A) -> bool {
93 !T::is(v, arg)
94 }
95}
96
97impl<I: Clone, T: Predicate<I, A>, A> ParseImpl<I, A> for Not<T> {
98 type Output = <Is<Self> as ParseImpl<I, A>>::Output;
99 impl_parse!(parse, _await, |input: I, arg: A| parse!(
100 Is::<Self>, input, arg
101 ));
102}
103
104pub type AsMany<T> = ConstSome<T>;
105
106pub struct ConstSome<T>(PhantomData<T>);
107
108impl<T: Const> Const for ConstSome<T> {
109 type Type = Option<T::Type>;
110 const VALUE: Self::Type = Some(T::VALUE);
111}
112
113pub struct ConstNone<T>(PhantomData<T>);
114
115impl<T> Const for ConstNone<T> {
116 type Type = Option<T>;
117 const VALUE: Self::Type = None;
118}
119
120pub struct ConstUSize<const VALUE: usize>;
121
122impl<const VALUE: usize> Const for ConstUSize<VALUE> {
123 type Type = usize;
124 const VALUE: Self::Type = VALUE;
125}
126
127pub struct AnyOf<C>(PhantomData<C>);
128
129impl<C: Const<Type = G>, G: IntoIterator<Item = T>, T: Borrow<U>, U: PartialEq, A> Predicate<U, A>
130 for AnyOf<C>
131{
132 #[inline(always)]
133 fn is(v: &U, _: &A) -> bool {
134 C::VALUE.into_iter().any(|x| v == x.borrow())
135 }
136}
137
138impl<C: Const<Type = G>, G: IntoIterator<Item = T>, T: Borrow<U>, U: PartialEq + Clone, A>
139 ParseImpl<U, A> for AnyOf<C>
140{
141 type Output = <Is<Self> as ParseImpl<U, A>>::Output;
142 impl_parse!(parse, _await, |input: U, _arg: A| parse!(
143 Is::<Self>,
144 input,
145 &()
146 ));
147}
148
149pub struct Seq<C>(PhantomData<C>);
150
151impl<C: Const<Type = G>, G: IntoIterator<Item = T>, T: Borrow<I>, I: PartialEq + Clone, A>
152 ParseImpl<I, A> for Seq<C>
153{
154 type Output = (Vec<I>,);
155 impl_parse!(parse, _await, |input: I, _arg: A| {
156 let i = C::VALUE.into_iter();
157 let mut count = 0;
158 for item in i {
159 match _await!(input.read(count + 1))?.get(count) {
160 Some(read) if read == item.borrow() => {
161 count += 1;
162 }
163 _ => return Err(Error::Mismatch),
164 }
165 }
166 let result = _await!(input.read(count))?.to_vec();
167 input.consume(count);
168 Ok((result,))
169 });
170}
171
172pub struct Discard<T = NoOp>(PhantomData<T>);
173
174pub struct NoOp<T = ()>(PhantomData<T>);
175
176pub struct Never<T>(PhantomData<T>);
177
178impl<I, T: ParseImpl<I, A>, A> ParseImpl<I, A> for Discard<T> {
179 type Output = ();
180 impl_parse!(parse, _await, |input: I, arg: A| {
181 parse!(T, input, arg)?;
182 Ok(())
183 });
184}
185
186impl<I, A, T: Default> ParseImpl<I, A> for NoOp<T> {
187 type Output = T;
188 impl_parse!(parse, _await, |__: I, _arg: A| Ok(T::default()));
189}
190
191impl<T, A> Mapper<(T,), A> for NoOp {
192 type Output = T;
193 #[inline(always)]
194 fn map((v,): (T,), _: &A) -> Self::Output {
195 v
196 }
197}
198
199impl<I, A, T> Predicate<I, A> for NoOp<T> {
200 #[inline(always)]
201 fn is(_: &I, _: &A) -> bool {
202 true
203 }
204}
205
206impl<I, O, T: ParseImpl<I, A, Output = O>, A> ParseImpl<I, A> for Never<T> {
207 type Output = O;
208 impl_parse!(parse, _await, |__: I, _arg: A| Err(Error::Mismatch));
209}
210
211impl<I, A, T> Predicate<I, A> for Never<T> {
212 #[inline(always)]
213 fn is(_: &I, _: &A) -> bool {
214 false
215 }
216}
217
218#[allow(clippy::type_complexity)]
219pub struct And<
220 T0 = NoOp,
221 T1 = NoOp,
222 T2 = NoOp,
223 T3 = NoOp,
224 T4 = NoOp,
225 T5 = NoOp,
226 T6 = NoOp,
227 T7 = NoOp,
228 T8 = NoOp,
229 T9 = NoOp,
230 T10 = NoOp,
231 T11 = NoOp,
232 T12 = NoOp,
233 T13 = NoOp,
234 T14 = NoOp,
235 T15 = NoOp,
236 T16 = NoOp,
237 T17 = NoOp,
238 T18 = NoOp,
239 T19 = NoOp,
240 T20 = NoOp,
241 T21 = NoOp,
242 T22 = NoOp,
243 T23 = NoOp,
244 T24 = NoOp,
245 T25 = NoOp,
246 T26 = NoOp,
247 T27 = NoOp,
248 T28 = NoOp,
249 T29 = NoOp,
250 T30 = NoOp,
251 T31 = NoOp,
252>(
253 PhantomData<(
254 T0,
255 T1,
256 T2,
257 T3,
258 T4,
259 T5,
260 T6,
261 T7,
262 T8,
263 T9,
264 T10,
265 T11,
266 T12,
267 T13,
268 T14,
269 T15,
270 T16,
271 T17,
272 T18,
273 T19,
274 T20,
275 T21,
276 T22,
277 T23,
278 T24,
279 T25,
280 T26,
281 T27,
282 T28,
283 T29,
284 T30,
285 T31,
286 )>,
287);
288
289impl<
290 I,
291 T0: ParseImpl<I, A, Output = C0>,
292 T1: ParseImpl<I, A>,
293 T2: ParseImpl<I, A>,
294 T3: ParseImpl<I, A>,
295 T4: ParseImpl<I, A>,
296 T5: ParseImpl<I, A>,
297 T6: ParseImpl<I, A>,
298 T7: ParseImpl<I, A>,
299 T8: ParseImpl<I, A>,
300 T9: ParseImpl<I, A>,
301 T10: ParseImpl<I, A>,
302 T11: ParseImpl<I, A>,
303 T12: ParseImpl<I, A>,
304 T13: ParseImpl<I, A>,
305 T14: ParseImpl<I, A>,
306 T15: ParseImpl<I, A>,
307 T16: ParseImpl<I, A>,
308 T17: ParseImpl<I, A>,
309 T18: ParseImpl<I, A>,
310 T19: ParseImpl<I, A>,
311 T20: ParseImpl<I, A>,
312 T21: ParseImpl<I, A>,
313 T22: ParseImpl<I, A>,
314 T23: ParseImpl<I, A>,
315 T24: ParseImpl<I, A>,
316 T25: ParseImpl<I, A>,
317 T26: ParseImpl<I, A>,
318 T27: ParseImpl<I, A>,
319 T28: ParseImpl<I, A>,
320 T29: ParseImpl<I, A>,
321 T30: ParseImpl<I, A>,
322 T31: ParseImpl<I, A>,
323 C0: Concat<T1::Output, Output = C1>,
324 C1: Concat<T2::Output, Output = C2>,
325 C2: Concat<T3::Output, Output = C3>,
326 C3: Concat<T4::Output, Output = C4>,
327 C4: Concat<T5::Output, Output = C5>,
328 C5: Concat<T6::Output, Output = C6>,
329 C6: Concat<T7::Output, Output = C7>,
330 C7: Concat<T8::Output, Output = C8>,
331 C8: Concat<T9::Output, Output = C9>,
332 C9: Concat<T10::Output, Output = C10>,
333 C10: Concat<T11::Output, Output = C11>,
334 C11: Concat<T12::Output, Output = C12>,
335 C12: Concat<T13::Output, Output = C13>,
336 C13: Concat<T14::Output, Output = C14>,
337 C14: Concat<T15::Output, Output = C15>,
338 C15: Concat<T16::Output, Output = C16>,
339 C16: Concat<T17::Output, Output = C17>,
340 C17: Concat<T18::Output, Output = C18>,
341 C18: Concat<T19::Output, Output = C19>,
342 C19: Concat<T20::Output, Output = C20>,
343 C20: Concat<T21::Output, Output = C21>,
344 C21: Concat<T22::Output, Output = C22>,
345 C22: Concat<T23::Output, Output = C23>,
346 C23: Concat<T24::Output, Output = C24>,
347 C24: Concat<T25::Output, Output = C25>,
348 C25: Concat<T26::Output, Output = C26>,
349 C26: Concat<T27::Output, Output = C27>,
350 C27: Concat<T28::Output, Output = C28>,
351 C28: Concat<T29::Output, Output = C29>,
352 C29: Concat<T30::Output, Output = C30>,
353 C30: Concat<T31::Output, Output = C31>,
354 C31,
355 A,
356 > ParseImpl<I, A>
357 for And<
358 T0,
359 T1,
360 T2,
361 T3,
362 T4,
363 T5,
364 T6,
365 T7,
366 T8,
367 T9,
368 T10,
369 T11,
370 T12,
371 T13,
372 T14,
373 T15,
374 T16,
375 T17,
376 T18,
377 T19,
378 T20,
379 T21,
380 T22,
381 T23,
382 T24,
383 T25,
384 T26,
385 T27,
386 T28,
387 T29,
388 T30,
389 T31,
390 >
391{
392 type Output = C31;
393 impl_parse!(parse, _await, |input: I, arg: A| {
394 let r = parse!(T0, input, arg)?;
395 macro_rules! impl_concat {
396 ($r:ident, $($t:ty),*$(,)?) => {$(
397 let $r = $r.concat(parse!($t, input, arg)?);
398 )*};
399 }
400 impl_concat!(
401 r, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18,
402 T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
403 );
404 let r = r.concat(parse!(T31, input, arg)?);
405 Ok(r)
406 });
407}
408
409impl<
410 I,
411 T0: Predicate<I, A>,
412 T1: Predicate<I, A>,
413 T2: Predicate<I, A>,
414 T3: Predicate<I, A>,
415 T4: Predicate<I, A>,
416 T5: Predicate<I, A>,
417 T6: Predicate<I, A>,
418 T7: Predicate<I, A>,
419 T8: Predicate<I, A>,
420 T9: Predicate<I, A>,
421 T10: Predicate<I, A>,
422 T11: Predicate<I, A>,
423 T12: Predicate<I, A>,
424 T13: Predicate<I, A>,
425 T14: Predicate<I, A>,
426 T15: Predicate<I, A>,
427 T16: Predicate<I, A>,
428 T17: Predicate<I, A>,
429 T18: Predicate<I, A>,
430 T19: Predicate<I, A>,
431 T20: Predicate<I, A>,
432 T21: Predicate<I, A>,
433 T22: Predicate<I, A>,
434 T23: Predicate<I, A>,
435 T24: Predicate<I, A>,
436 T25: Predicate<I, A>,
437 T26: Predicate<I, A>,
438 T27: Predicate<I, A>,
439 T28: Predicate<I, A>,
440 T29: Predicate<I, A>,
441 T30: Predicate<I, A>,
442 T31: Predicate<I, A>,
443 A,
444 > Predicate<I, A>
445 for And<
446 T0,
447 T1,
448 T2,
449 T3,
450 T4,
451 T5,
452 T6,
453 T7,
454 T8,
455 T9,
456 T10,
457 T11,
458 T12,
459 T13,
460 T14,
461 T15,
462 T16,
463 T17,
464 T18,
465 T19,
466 T20,
467 T21,
468 T22,
469 T23,
470 T24,
471 T25,
472 T26,
473 T27,
474 T28,
475 T29,
476 T30,
477 T31,
478 >
479{
480 #[inline(always)]
481 fn is(v: &I, a: &A) -> bool {
482 macro_rules! impl_is {
483 ($($t:ty),*$(,)?) => {
484 $(<$t>::is(v, a))&&*
485 };
486 }
487 impl_is!(
488 T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18,
489 T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31,
490 )
491 }
492}
493
494#[allow(clippy::type_complexity)]
495pub struct Or<
496 T0 = Never<NoOp>,
497 T1 = Never<T0>,
498 T2 = Never<T0>,
499 T3 = Never<T0>,
500 T4 = Never<T0>,
501 T5 = Never<T0>,
502 T6 = Never<T0>,
503 T7 = Never<T0>,
504 T8 = Never<T0>,
505 T9 = Never<T0>,
506 T10 = Never<T0>,
507 T11 = Never<T0>,
508 T12 = Never<T0>,
509 T13 = Never<T0>,
510 T14 = Never<T0>,
511 T15 = Never<T0>,
512 T16 = Never<T0>,
513 T17 = Never<T0>,
514 T18 = Never<T0>,
515 T19 = Never<T0>,
516 T20 = Never<T0>,
517 T21 = Never<T0>,
518 T22 = Never<T0>,
519 T23 = Never<T0>,
520 T24 = Never<T0>,
521 T25 = Never<T0>,
522 T26 = Never<T0>,
523 T27 = Never<T0>,
524 T28 = Never<T0>,
525 T29 = Never<T0>,
526 T30 = Never<T0>,
527 T31 = Never<T0>,
528>(
529 PhantomData<(
530 T0,
531 T1,
532 T2,
533 T3,
534 T4,
535 T5,
536 T6,
537 T7,
538 T8,
539 T9,
540 T10,
541 T11,
542 T12,
543 T13,
544 T14,
545 T15,
546 T16,
547 T17,
548 T18,
549 T19,
550 T20,
551 T21,
552 T22,
553 T23,
554 T24,
555 T25,
556 T26,
557 T27,
558 T28,
559 T29,
560 T30,
561 T31,
562 )>,
563);
564
565impl<
566 T0: ParseImpl<I, A, Output = O>,
567 T1: ParseImpl<I, A, Output = O>,
568 T2: ParseImpl<I, A, Output = O>,
569 T3: ParseImpl<I, A, Output = O>,
570 T4: ParseImpl<I, A, Output = O>,
571 T5: ParseImpl<I, A, Output = O>,
572 T6: ParseImpl<I, A, Output = O>,
573 T7: ParseImpl<I, A, Output = O>,
574 T8: ParseImpl<I, A, Output = O>,
575 T9: ParseImpl<I, A, Output = O>,
576 T10: ParseImpl<I, A, Output = O>,
577 T11: ParseImpl<I, A, Output = O>,
578 T12: ParseImpl<I, A, Output = O>,
579 T13: ParseImpl<I, A, Output = O>,
580 T14: ParseImpl<I, A, Output = O>,
581 T15: ParseImpl<I, A, Output = O>,
582 T16: ParseImpl<I, A, Output = O>,
583 T17: ParseImpl<I, A, Output = O>,
584 T18: ParseImpl<I, A, Output = O>,
585 T19: ParseImpl<I, A, Output = O>,
586 T20: ParseImpl<I, A, Output = O>,
587 T21: ParseImpl<I, A, Output = O>,
588 T22: ParseImpl<I, A, Output = O>,
589 T23: ParseImpl<I, A, Output = O>,
590 T24: ParseImpl<I, A, Output = O>,
591 T25: ParseImpl<I, A, Output = O>,
592 T26: ParseImpl<I, A, Output = O>,
593 T27: ParseImpl<I, A, Output = O>,
594 T28: ParseImpl<I, A, Output = O>,
595 T29: ParseImpl<I, A, Output = O>,
596 T30: ParseImpl<I, A, Output = O>,
597 T31: ParseImpl<I, A, Output = O>,
598 I,
599 O,
600 A,
601 > ParseImpl<I, A>
602 for Or<
603 T0,
604 T1,
605 T2,
606 T3,
607 T4,
608 T5,
609 T6,
610 T7,
611 T8,
612 T9,
613 T10,
614 T11,
615 T12,
616 T13,
617 T14,
618 T15,
619 T16,
620 T17,
621 T18,
622 T19,
623 T20,
624 T21,
625 T22,
626 T23,
627 T24,
628 T25,
629 T26,
630 T27,
631 T28,
632 T29,
633 T30,
634 T31,
635 >
636{
637 type Output = O;
638 impl_parse!(parse, _await, |input: I, arg: A| {
639 macro_rules! impl_or {
640 ($i:expr, $($t:ty),*$(,)?) => {$(
641 let mut fork = $i.fork();
642 match parse!($t, &mut fork, arg) {
643 Ok(item) => {
644 fork.join();
645 return Ok(item);
646 }
647 Err(e @ Error::Hard(_)) => {
648 fork.join();
649 return Err(e);
650 }
651 _ => drop(fork),
652 }
653 )*};
654 }
655 impl_or!(
656 input, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17,
657 T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
658 );
659
660 let mut fork = input.fork();
661 match parse!(T31, &mut fork, arg) {
662 Ok(item) => {
663 fork.join();
664 return Ok(item);
665 }
666 Err(e @ Error::Hard(_)) => {
667 fork.join();
668 return Err(e);
669 }
670 _ => drop(fork),
671 }
672
673 Err(Error::Mismatch)
674 });
675}
676
677impl<
678 I,
679 T0: Predicate<I, A>,
680 T1: Predicate<I, A>,
681 T2: Predicate<I, A>,
682 T3: Predicate<I, A>,
683 T4: Predicate<I, A>,
684 T5: Predicate<I, A>,
685 T6: Predicate<I, A>,
686 T7: Predicate<I, A>,
687 T8: Predicate<I, A>,
688 T9: Predicate<I, A>,
689 T10: Predicate<I, A>,
690 T11: Predicate<I, A>,
691 T12: Predicate<I, A>,
692 T13: Predicate<I, A>,
693 T14: Predicate<I, A>,
694 T15: Predicate<I, A>,
695 T16: Predicate<I, A>,
696 T17: Predicate<I, A>,
697 T18: Predicate<I, A>,
698 T19: Predicate<I, A>,
699 T20: Predicate<I, A>,
700 T21: Predicate<I, A>,
701 T22: Predicate<I, A>,
702 T23: Predicate<I, A>,
703 T24: Predicate<I, A>,
704 T25: Predicate<I, A>,
705 T26: Predicate<I, A>,
706 T27: Predicate<I, A>,
707 T28: Predicate<I, A>,
708 T29: Predicate<I, A>,
709 T30: Predicate<I, A>,
710 T31: Predicate<I, A>,
711 A,
712 > Predicate<I, A>
713 for Or<
714 T0,
715 T1,
716 T2,
717 T3,
718 T4,
719 T5,
720 T6,
721 T7,
722 T8,
723 T9,
724 T10,
725 T11,
726 T12,
727 T13,
728 T14,
729 T15,
730 T16,
731 T17,
732 T18,
733 T19,
734 T20,
735 T21,
736 T22,
737 T23,
738 T24,
739 T25,
740 T26,
741 T27,
742 T28,
743 T29,
744 T30,
745 T31,
746 >
747{
748 #[inline(always)]
749 fn is(v: &I, a: &A) -> bool {
750 macro_rules! impl_is {
751 ($($t:ty),*$(,)?) => {
752 $(<$t>::is(v, a))||*
753 };
754 }
755 impl_is!(
756 T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18,
757 T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31,
758 )
759 }
760}
761
762pub struct Repeat<T, const MIN: usize = 0, const MAX: usize = { usize::MAX }>(PhantomData<T>);
763
764impl<I, T: ParseImpl<I, A, Output = (O,)>, O, A, const MIN: usize, const MAX: usize> ParseImpl<I, A>
765 for Repeat<T, MIN, MAX>
766{
767 type Output = (Vec<O>,);
768 impl_parse!(parse, _await, |input: I, arg: A| {
769 let mut result = Vec::new();
770 let mut le = None;
771 for _ in 0..MAX {
772 match parse!(T, input, arg) {
773 Ok((item,)) => result.push(item),
774 Err(e @ Error::Hard(_)) => {
775 return Err(e);
776 }
777 Err(e) => {
778 le = Some(e);
779 break;
780 }
781 }
782 }
783 if result.len() < MIN {
784 return Err(le.unwrap_or(Error::Mismatch));
785 }
786 Ok((result,))
787 });
788}
789
790pub struct Optional<T>(PhantomData<T>);
791
792impl<I, T: ParseImpl<I, A, Output = (O,)>, O, A> ParseImpl<I, A> for Optional<T> {
793 type Output = (Option<O>,);
794 impl_parse!(parse, _await, |input: I, arg: A| {
795 match parse!(T, input, arg) {
796 Ok((item,)) => Ok((Some(item),)),
797 Err(e @ Error::Hard(_)) => Err(e),
798 Err(_) => Ok((None,)),
799 }
800 });
801}
802
803pub struct Punctuated<T, P, const MIN: usize = 0, const MAX: usize = { usize::MAX }>(
804 PhantomData<(T, P)>,
805);
806
807impl<
808 I: core::fmt::Debug,
809 T: ParseImpl<I, A, Output = (O,)>,
810 O,
811 P: ParseImpl<I, A, Output = (PO,)>,
812 PO,
813 A,
814 const MIN: usize,
815 const MAX: usize,
816 > ParseImpl<I, A> for Punctuated<T, P, MIN, MAX>
817{
818 type Output = (Vec<O>, Vec<PO>);
819 impl_parse!(parse, _await, |input: I, arg: A| {
820 let mut result = Vec::new();
821 let mut puncts = Vec::new();
822 let mut le = None;
823
824 'matching: {
825 match parse!(T, input, arg) {
826 Ok((item,)) => result.push(item),
827 Err(e @ Error::Hard(_)) => {
828 return Err(e);
829 }
830 Err(e) => {
831 le = Some(e);
832 break 'matching;
833 }
834 }
835
836 for _ in 1..MAX {
837 let mut input = input.fork();
838 match parse!(P, &mut input, arg) {
839 Ok((item,)) => puncts.push(item),
840 Err(e @ Error::Hard(_)) => {
841 return Err(e);
842 }
843 Err(e) => {
844 le = Some(e);
845 break;
846 }
847 }
848
849 match parse!(T, &mut input, arg) {
850 Ok((item,)) => {
851 result.push(item);
852 input.join();
853 }
854 Err(e @ Error::Hard(_)) => {
855 return Err(e);
856 }
857 Err(e) => {
858 puncts.pop();
859 le = Some(e);
860 break;
861 }
862 }
863 }
864 }
865 if result.len() < MIN {
866 return Err(le.unwrap_or(Error::Mismatch));
867 }
868 Ok((result, puncts))
869 });
870}
871
872pub struct Map<P, M = NoOp>(PhantomData<(P, M)>);
873
874pub struct TryMap<P, M>(PhantomData<(P, M)>);
875
876pub struct IsMap<P, M>(PhantomData<(P, M)>);
877
878impl<I, P: ParseImpl<I, A, Output = T>, M: Mapper<T, A, Output = U>, T, U, A> ParseImpl<I, A>
879 for Map<P, M>
880{
881 type Output = (U,);
882 impl_parse!(parse, _await, |input: I, arg: A| Ok((M::map(
883 parse!(P, input, arg)?,
884 arg
885 ),)));
886}
887
888impl<I, P: ParseImpl<I, A, Output = T>, M: Mapper<T, A, Output = Result<U>>, T, U, A>
889 ParseImpl<I, A> for TryMap<P, M>
890{
891 type Output = (U,);
892 impl_parse!(parse, _await, |input: I, arg: A| Ok((M::map(
893 parse!(P, input, arg)?,
894 arg
895 )?,)));
896}
897
898impl<I, P: ParseImpl<I, A, Output = T>, M: Mapper<T, A, Output = Option<U>>, T, U, A>
899 ParseImpl<I, A> for IsMap<P, M>
900{
901 type Output = (U,);
902 impl_parse!(parse, _await, |input: I, arg: A| Ok((M::map(
903 parse!(P, input, arg)?,
904 arg
905 )
906 .ok_or(Error::Mismatch)?,)));
907}
908
909pub struct Expected<T, N>(PhantomData<(T, N)>);
910
911impl<I, T: ParseImpl<I, A>, N: Const<Type = &'static str>, A> ParseImpl<I, A> for Expected<T, N> {
912 type Output = T::Output;
913 impl_parse!(parse, _await, |input: I, arg: A| parse!(T, input, arg)
914 .map_err(|e| {
915 match e {
916 Error::Mismatch => HardError::Incomplete {
917 position: input.position(),
918 name: N::VALUE,
919 }
920 .into(),
921 Error::NamedMismatch(component_name) => HardError::NamedIncomplete {
922 position: input.position(),
923 name: N::VALUE,
924 component_name,
925 }
926 .into(),
927 _ => e,
928 }
929 }));
930}
931
932pub struct Name<T, N>(PhantomData<(T, N)>);
933
934impl<I, T: ParseImpl<I, A>, N: Const<Type = &'static str>, A> ParseImpl<I, A> for Name<T, N> {
935 type Output = T::Output;
936 impl_parse!(parse, _await, |input: I, arg: A| parse!(T, input, arg)
937 .map_err(|e| {
938 if let Error::Mismatch = e {
939 Error::NamedMismatch(N::VALUE)
940 } else {
941 e
942 }
943 }));
944}
945
946pub struct Peek<T>(PhantomData<T>);
947
948impl<T: ParseImpl<I, A>, I, A> ParseImpl<I, A> for Peek<T> {
949 type Output = T::Output;
950 impl_parse!(parse, _await, |input: I, arg: A| parse!(
951 T,
952 &mut input.fork(),
953 arg
954 ));
955}
956
957pub struct AndWithArg<T0 = NoOp, T1 = NoOp>(PhantomData<(T0, T1)>);
958
959impl<I, T0: ParseImpl<I, A0, Output = (A1,)>, T1: ParseImpl<I, A1>, A0, A1: Clone> ParseImpl<I, A0>
960 for AndWithArg<T0, T1>
961where
962 (A1,): Concat<T1::Output>,
963{
964 type Output = <(A1,) as Concat<T1::Output>>::Output;
965
966 impl_parse!(parse, _await, |input: I, arg: A0| {
967 let r = parse!(T0, input, arg)?;
968 Ok(r.clone().concat(parse!(T1, input, &r.0)?))
969 });
970}
971
972pub struct MapRange<T, M = ConcatArg>(PhantomData<(T, M)>);
973
974impl<I, A, T: ParseImpl<I, A>, M: Mapper<T::Output, Range<usize>>> ParseImpl<I, A>
975 for MapRange<T, M>
976{
977 type Output = (M::Output,);
978 impl_parse!(parse, _await, |input: I, arg: A| {
979 let start = input.position();
980 let result = parse!(T, input, arg)?;
981 let end = input.position();
982 Ok((M::map(result, &(start..end)),))
983 });
984}
985
986pub struct ConcatArg;
987
988impl<T: Concat<(A,)>, A: Clone> Mapper<T, A> for ConcatArg {
989 type Output = T::Output;
990 #[inline(always)]
991 fn map(v: T, a: &A) -> Self::Output {
992 v.concat((a.clone(),))
993 }
994}
995
996pub struct Start;
997
998impl<I, A> ParseImpl<I, A> for Start {
999 type Output = ();
1000 impl_parse!(parse, _await, |input: I, _arg: A| {
1001 if input.position() == 0 {
1002 Ok(())
1003 } else {
1004 Err(Error::Mismatch)
1005 }
1006 });
1007}
1008
1009pub struct End;
1010
1011impl<I, A> ParseImpl<I, A> for End {
1012 type Output = ();
1013 impl_parse!(parse, _await, |input: I, _arg: A| {
1014 if _await!(input.read(1))?.is_empty() {
1015 Ok(())
1016 } else {
1017 Err(Error::Mismatch)
1018 }
1019 });
1020}