use crate::mode::*;
use super::*;
/// [`Mode`] for [`InliningFactory`].
pub struct InliningMode;
impl Mode for InliningMode {
/// Keeps the parser.
type ParseSuccess = (A, I);
/// Always fails.
type ExtensionResult = E;
/// Discards the value.
type ExtensionSource = ();
fn bind(
s: Self::ParseSuccess,
f: impl FnOnce(A0) -> Result,
) -> ModeResult {
let (a0, i) = s;
let a1 = f(a0)?;
Ok((a1, i))
}
fn map(
s: Self::ParseSuccess,
f: impl FnOnce(A0) -> A1,
) -> Self::ParseSuccess {
(f(s.0), s.1)
}
fn seal(s: Self::ParseSuccess) -> A {
s.0
}
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)
}
fn smap(
source: Self::ExtensionSource,
_f: impl FnOnce(A0) -> A1,
) -> Self::ExtensionSource {
source
}
fn prepare(_a: A) -> Self::ExtensionSource {}
fn xsbind(
_ab: Self::ExtensionSource,
_t2ab: impl FnOnce(AB) -> (A, B),
ce: impl FnOnce(Self::ExtensionSource) -> Self::ExtensionResult,
_ab2t: impl FnOnce(A, B) -> Result,
) -> Self::ExtensionResult {
ce(())
}
}
impl<'a, Ctx: Context<'a>, F: CInliningFactory<'a, Ctx>> FactoryModeProxy<'a, Ctx>
for WithMode
{
type F = F;
fn pmdeserialize>(f: &Self::F, inctx: I) -> ModeResultM<'a, Ctx, F, I> {
f.cideserialize(inctx)
}
fn pmextend(
f: &F,
_mentionable: ExtensionSourceM<'a, Ctx, F>,
tail: &[u8],
) -> ExtensionResultM<'a, Ctx, F> {
f.cextension_error(tail)
}
}
impl AtomicModeProxy for WithMode {
type A = A;
fn pma_deserialize(stream: I) -> AModeResultM {
A::ca_ideserialize(stream)
}
fn pma_extend(_atomic: AExtensionSourceM, tail: &[u8]) -> AExtensionResultM {
A::ca_extension_error(tail)
}
}