use crate::parser::{ErrorInput, ParseError};
use crate::program::error::LeftoverError;
use crate::program::ParseProgramError;
use nom::Finish;
use super::SyntaxError;
pub fn disallow_leftover<I, O, E>(result: nom::IResult<I, O, ParseError>) -> Result<O, E>
where
I: ErrorInput,
E: From<SyntaxError<O>>,
{
match result.finish() {
Ok((leftover, parsed)) => {
if leftover.is_empty() {
Ok(parsed)
} else {
Err(E::from(SyntaxError::from(LeftoverError::new(
leftover, parsed,
))))
}
}
Err(err) => Err(E::from(SyntaxError::from(err))),
}
}
pub fn map_parsed<O, O2>(
result: Result<O, ParseProgramError<O>>,
map: impl Fn(O) -> O2,
) -> Result<O2, ParseProgramError<O2>> {
match result {
Ok(parsed) => Ok(map(parsed)),
Err(err) => Err(err.map_parsed(map)),
}
}
pub fn recover<O>(result: Result<O, ParseProgramError<O>>) -> Result<O, ParseProgramError<O>> {
match result {
Ok(parsed) => Ok(parsed),
Err(ParseProgramError::Syntax(err)) => err.recover().map_err(ParseProgramError::from),
Err(err) => Err(err),
}
}