// © 2023 John Breaux use super::*; /// Parses tokens from [stream](TokenStream) into Self node pub trait Parsable { /// Parses tokens from [TokenStream](TokenStream) into Self nodes fn parse<'text, T>(p: &Parser, stream: &mut T) -> Result where Self: Sized, T: TokenStream<'text>; /// Attempts to parse tokens from [stream](TokenStream) into Self nodes. /// /// Masks failed expectations. fn try_parse<'text, T>(p: &Parser, stream: &mut T) -> Result, Error> where Self: Sized, T: TokenStream<'text>, { match Self::parse(p, stream).map_err(|e| e.bare()) { Ok(tt) => Ok(Some(tt)), Err(Error::UnexpectedToken { .. }) | Err(Error::AllExpectationsFailed { .. }) => Ok(None), Err(e) => Err(e.context(stream.context())), } } fn parse_and<'text, T, R>(p: &Parser, stream: &mut T, f: fn(p: &Parser, &mut T) -> R) -> Result<(Self, R), Error> where Self: Sized, T: TokenStream<'text>, { Ok((Self::parse(p, stream)?, f(p, stream))) } /// Attempts to parse tokens from [stream](TokenStream) into Self nodes. /// /// Returns [`Self::default()`](Default::default()) on error fn parse_or_default<'text, T>(p: &Parser, stream: &mut T) -> Self where Self: Sized + Default, T: TokenStream<'text>, { Self::parse(p, stream).unwrap_or_default() } }