1use core::marker::PhantomData;
2
3use crate::*;
4
5pub struct Parser<T>(PhantomData<T>);
7
8impl<T> Parser<T> {
9 pub fn parse(input: &str) -> Result<T, ()>
11 where T: ParseImpl<0, false> + AstImpl<()>
12 {
13 let mut trace = Vec::new();
15 let mut stack = Vec::new();
16 let end = 0;
17 <T as ParseImpl<0, false>>::parse_impl(input, end, 0, false, &mut trace, &mut stack)?;
18 Ok(T::peggen_ast(input, &stack, ()).1)
20 }
21 pub fn parse_with<Extra>(input: &str, with: Extra) -> Result<T, ()>
23 where T: ParseImpl<0, false> + AstImpl<Extra>,
24 Extra: Copy
25 {
26 let mut trace = Vec::new();
28 let mut stack = Vec::new();
29 let end = 0;
30 <T as ParseImpl<0, false>>::parse_impl(input, end, 0, false, &mut trace, &mut stack)?;
31 Ok(T::peggen_ast(input, &stack, with).1)
33 }
34 pub fn sequence(input: &str) -> Result<Vec<Tag>, ()>
36 where T: ParseImpl<0, false> + AstImpl<()>
37 {
38 let mut trace = Vec::new();
39 let mut stack = Vec::new();
40 let end = 0;
41 <T as ParseImpl<0, false>>::parse_impl(input, end, 0, false, &mut trace, &mut stack)?;
42 Ok(stack)
43 }
44}