use super::*;
pub struct InliningMode;
impl Mode for InliningMode {
type ParseResult = Result<(A, I), E>;
type ExtensionResult = E;
fn map_err(
result: Self::ParseResult,
f: impl FnOnce(E0) -> E1,
) -> Self::ParseResult {
result.map_err(f)
}
fn bind(
result: Self::ParseResult,
f: impl FnOnce(A0) -> Result,
) -> Self::ParseResult {
let (a0, i) = result?;
let a1 = f(a0)?;
Ok((a1, i))
}
fn seal(result: Self::ParseResult) -> Result {
result.map(|(a, _)| a)
}
fn xmap_err(
result: Self::ExtensionResult,
f: impl FnOnce(E0) -> E1,
) -> Self::ExtensionResult {
f(result)
}
fn xbind(
result: Self::ExtensionResult,
_f: impl FnOnce(A0) -> Result,
) -> Self::ExtensionResult {
result
}
fn xseal(result: Self::ExtensionResult) -> Result {
Err(result)
}
}
impl<'a, Ctx: Context<'a>, F: InlineableFactory<'a, Ctx>> FactoryModeProxy<'a, Ctx>
for WithMode
{
type F = F;
fn pmdeserialize>(f: &Self::F, inctx: I) -> ParseResultM<'a, Ctx, F, I> {
f.ideserialize(inctx)
}
fn pmextend(
f: &F,
_mentionable: Mtbl<'a, Ctx, F>,
tail: &[u8],
) -> ExtensionResultM<'a, Ctx, F> {
f.extension_error(tail)
}
}
impl AtomicProxy for WithMode {
type A = A;
fn pa_deserialize(inlining: impl Inlining) -> AParseResult {
A::a_ideserialize(inlining).seal()
}
fn pa_extend(_a: Self::A, tail: &[u8]) -> AParseResult {
Err(A::a_extension_error(tail))
}
}