FactoryParse via FactoryModeParse

This commit is contained in:
AF 2023-07-29 19:28:44 +00:00
parent 4a9c2c0c3b
commit 486d7e7af8
2 changed files with 13 additions and 6 deletions

View File

@ -28,6 +28,8 @@ pub trait Mode {
result: Self::ExtensionResult<A0, E>,
f: impl FnOnce(A0) -> Result<A1, E>,
) -> Self::ExtensionResult<A1, E>;
fn xseal<A, E>(result: Self::ExtensionResult<A, E>) -> Result<A, E>;
}
pub trait ParseMode {
@ -55,16 +57,13 @@ pub trait FactoryProxy<'a, Ctx: Context<'a>> {
) -> ParseResult<'a, Ctx, Self::F>;
}
impl<'a, Ctx: Context<'a>, F: FactoryBase<'a, Ctx> + WithParseMode> FactoryParse<'a, Ctx> for F
where
F::WithMode: FactoryProxy<'a, Ctx, F = Self>,
{
impl<'a, Ctx: Context<'a>, F: FactoryModeParse<'a, Ctx>> FactoryParse<'a, Ctx> for F {
fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> {
<F::WithMode as FactoryProxy<'a, Ctx>>::pdeserialize(self, inctx)
<<Self as ParseMode>::Mode as Mode>::seal(self.mdeserialize(inctx))
}
fn extend(&self, mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self> {
<F::WithMode as FactoryProxy<'a, Ctx>>::pextend(self, mentionable, tail)
<<Self as ParseMode>::Mode as Mode>::xseal(self.mextend(mentionable, tail))
}
}
@ -149,6 +148,10 @@ impl Mode for RegularMode {
) -> Self::ExtensionResult<A1, E> {
result.and_then(f)
}
fn xseal<A, E>(result: Self::ExtensionResult<A, E>) -> Result<A, E> {
result
}
}
pub trait RegularFactory<'a, Ctx: Context<'a>>:

View File

@ -40,6 +40,10 @@ impl Mode for InliningMode {
) -> Self::ExtensionResult<A1, E> {
result
}
fn xseal<A, E>(result: Self::ExtensionResult<A, E>) -> Result<A, E> {
Err(result)
}
}
impl<'a, Ctx: Context<'a>, F: InlineableFactory<'a, Ctx>> FactoryProxy<'a, Ctx>