use crate::parsing::exception::{ParseException, ParseWarning};
use std::marker::PhantomData;
pub type ParseResult<'r, 't, T> = Result<ParseSuccess<'r, 't, T>, ParseWarning>;
pub type ParseSuccessTuple<'t, T> = (T, Vec<ParseException<'t>>);
#[must_use]
#[derive(Debug, Clone)]
pub struct ParseSuccess<'r, 't, T>
where
'r: 't,
T: 't,
{
pub item: T,
pub exceptions: Vec<ParseException<'t>>,
#[doc(hidden)]
_marker: PhantomData<&'r ()>,
}
impl<'r, 't, T> ParseSuccess<'r, 't, T> {
#[inline]
pub fn new(item: T, exceptions: Vec<ParseException<'t>>) -> Self {
ParseSuccess {
item,
exceptions,
_marker: PhantomData,
}
}
pub fn chain(self, all_exceptions: &mut Vec<ParseException<'t>>) -> T {
let ParseSuccess {
item,
mut exceptions,
..
} = self;
all_exceptions.append(&mut exceptions);
item
}
}
impl<'r, 't, T> ParseSuccess<'r, 't, T>
where
T: 't,
{
pub fn map<F, U>(self, f: F) -> ParseSuccess<'r, 't, U>
where
F: FnOnce(T) -> U,
{
let ParseSuccess {
item, exceptions, ..
} = self;
let new_item = f(item);
ParseSuccess {
item: new_item,
exceptions,
_marker: PhantomData,
}
}
#[inline]
pub fn map_ok<F, U>(self, f: F) -> ParseResult<'r, 't, U>
where
F: FnOnce(T) -> U,
{
Ok(self.map(f))
}
}
impl<'r, 't> ParseSuccess<'r, 't, ()> {
#[inline]
pub fn into_exceptions(self) -> Vec<ParseException<'t>> {
self.exceptions
}
}
impl<'r, 't, T> From<ParseSuccess<'r, 't, T>> for ParseSuccessTuple<'t, T> {
#[inline]
fn from(success: ParseSuccess<'r, 't, T>) -> ParseSuccessTuple<'t, T> {
let ParseSuccess {
item, exceptions, ..
} = success;
(item, exceptions)
}
}