1use crate::{IntoSkipOrFatal, SkipOrFatal};
2
3type ParseAsComponentResult<'a, Output, Error> =
4 Result<Option<(Output, &'a str)>, <Error as IntoSkipOrFatal>::Fatal>;
5
6pub 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}