NodeFactory
via FactoryModeParse
This commit is contained in:
parent
25fe0655dc
commit
7f1d72898d
@ -142,25 +142,32 @@ impl<'a, Ctx: Context<'a>, F: FactoryBase<'a, Ctx>> FactoryBase<'a, Ctx> for Nod
|
|||||||
type ParseError = TreeParseError<F::ParseError>;
|
type ParseError = TreeParseError<F::ParseError>;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<F> ImplMode for NodeFactory<F> {
|
impl<F: ParseMode> ParseMode for NodeFactory<F> {
|
||||||
type Mode = RegularMode;
|
type Mode = F::Mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, F: FactoryParse<'a, Ctx>> CRegularFactory<'a, Ctx> for NodeFactory<F> {
|
impl<'a, Ctx: Context<'a>, F: FactoryModeParse<'a, Ctx>> FactoryModeParse<'a, Ctx>
|
||||||
fn crdeserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> {
|
for NodeFactory<F>
|
||||||
|
{
|
||||||
|
fn mdeserialize<I: InCtx<'a, Ctx>>(&self, inctx: I) -> ModeResultM<'a, Ctx, Self, I> {
|
||||||
let tree_factory = TreeFactory(NullableFactory::new(self.clone()));
|
let tree_factory = TreeFactory(NullableFactory::new(self.clone()));
|
||||||
let (l, inctx) = tree_factory.ideserialize(inctx)?;
|
let (l, inctx) = tree_factory.ideserialize(inctx)?;
|
||||||
let (r, inctx) = tree_factory.ideserialize(inctx)?;
|
let (r, inctx) = tree_factory.ideserialize(inctx)?;
|
||||||
let key = self.0.deserialize(inctx).map_err(TreeParseError::Key)?;
|
let skey = self.0.mdeserialize(inctx).map_err(TreeParseError::Key)?;
|
||||||
Ok(Node { l, r, key })
|
Ok(Self::map(skey, |key| Node { l, r, key }))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn crextend(&self, mut mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self> {
|
fn mextend(
|
||||||
mentionable.key = self
|
&self,
|
||||||
.0
|
mentionable: ExtensionSourceM<'a, Ctx, Self>,
|
||||||
.extend(mentionable.key, tail)
|
tail: &[u8],
|
||||||
.map_err(TreeParseError::Key)?;
|
) -> ExtensionResultM<'a, Ctx, Self> {
|
||||||
Ok(mentionable)
|
Self::xsbind(
|
||||||
|
mentionable,
|
||||||
|
|Node { l, r, key }| ((l, r), key),
|
||||||
|
|key| Self::xmap_err(self.0.mextend(key, tail), TreeParseError::Key),
|
||||||
|
|(l, r), key| Ok(Node { l, r, key }),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user