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) } }