lazy_template/
parse.rs

1use crate::{IntoSkipOrFatal, SkipOrFatal};
2
3type ParseAsComponentResult<'a, Output, Error> =
4    Result<Option<(Output, &'a str)>, <Error as IntoSkipOrFatal>::Fatal>;
5
6/// Parse a segment.
7pub trait Parse<'a, Input = &'a str>: Sized {
8    type Output;
9    type Error;
10    fn parse(&self, input: Input) -> Result<(Self::Output, &'a str), Self::Error>;
11
12    fn parse_as_component(
13        &self,
14        input: Input,
15    ) -> ParseAsComponentResult<'a, Self::Output, Self::Error>
16    where
17        Self::Error: IntoSkipOrFatal,
18    {
19        let parse_result = self
20            .parse(input)
21            .map_err(IntoSkipOrFatal::into_skip_or_fatal);
22        match parse_result {
23            Ok(pair) => Ok(Some(pair)),
24            Err(SkipOrFatal::Fatal(error)) => Err(error),
25            Err(SkipOrFatal::Skip(_)) => Ok(None),
26        }
27    }
28}