2022-10-21 22:22:21 -07:00
|
|
|
use crate::bnf::Bnf;
|
|
|
|
use crate::parser::{ParseResult, Parser, ParserInput};
|
|
|
|
|
|
|
|
pub struct BoxedParser<'a, I, O, E>
|
|
|
|
where
|
|
|
|
I: ParserInput,
|
|
|
|
{
|
|
|
|
inner: Box<dyn Parser<I, O, E> + 'a>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a, I, O, E> BoxedParser<'a, I, O, E>
|
|
|
|
where
|
|
|
|
I: ParserInput,
|
|
|
|
{
|
|
|
|
pub(crate) fn new<P>(inner: P) -> Self
|
|
|
|
where
|
|
|
|
P: Parser<I, O, E> + 'a,
|
|
|
|
{
|
|
|
|
BoxedParser {
|
|
|
|
inner: Box::new(inner),
|
|
|
|
}
|
|
|
|
}
|
2022-10-21 22:45:42 -07:00
|
|
|
|
2022-10-21 22:22:21 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a, I: ParserInput, O, E> Parser<I, O, E> for BoxedParser<'a, I, O, E> {
|
|
|
|
fn parse(&self, input: I) -> ParseResult<I, O, E> {
|
|
|
|
self.inner.parse(input)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn bnf(&self) -> Option<Bnf> {
|
|
|
|
self.inner.bnf()
|
|
|
|
}
|
2022-10-21 22:45:42 -07:00
|
|
|
|
|
|
|
fn boxed<'b>(self) -> BoxedParser<'b, I, O, E> where Self: Sized + 'b {
|
|
|
|
self
|
|
|
|
}
|
2022-10-21 22:22:21 -07:00
|
|
|
}
|