use super::{addresses::InliningAddresses, dectx::DeCtx, *};
pub trait InCtx<'a, Ctx: Context<'a>>: Stream {
fn icnext_address<E>(self, err: impl FnOnce(&[u8]) -> E) -> Result<(Address, Self), E>;
fn icnext_point<'b, A: MentionableBase<'a>, E>(
self,
factory: A::Fctr,
err: impl FnOnce(&[u8]) -> E,
) -> Result<(Point<'a, Ctx, A>, Self), E> {
let (point, inctx) = self.icnext_address(err)?;
Ok((
Point::from_address(point, factory, inctx.iresolver()),
inctx,
))
}
fn iresolver(&self) -> Arc<dyn Resolver<'a, Ctx>>;
fn demote<'d>(self) -> Demoted<'a, 'd, Ctx>
where
'a: 'd,
Self: 'd;
}
impl<'a: 'c, 'c, Ctx: Context<'a>> Stream for &'c mut dyn DeCtx<'a, Ctx> {
fn iread_n<A, E>(
self,
n: usize,
ok: impl FnOnce(&[u8]) -> A,
err: impl FnOnce(&[u8]) -> E,
) -> Result<(A, Self), E> {
match self.deserializer().iread_n(n, ok, err) {
Ok((a, _)) => Ok((a, self)),
Err(e) => Err(e),
}
}
fn iread_all<A>(self, ok: impl FnOnce(&[u8]) -> A) -> A {
self.deserializer().iread_all(ok)
}
fn itell(&self) -> usize {
self.tell()
}
}
impl<'a: 'c, 'c, Ctx: Context<'a>> InCtx<'a, Ctx> for &'c mut dyn DeCtx<'a, Ctx> {
fn icnext_address<E>(self, err: impl FnOnce(&[u8]) -> E) -> Result<(Address, Self), E> {
let (addresses, deserialiser) = self.ad();
match deserialiser.inext_address(addresses, err) {
Ok((address, _)) => Ok((address, self)),
Err(e) => Err(e),
}
}
fn iresolver(&self) -> Arc<dyn Resolver<'a, Ctx>> {
self.resolver()
}
fn demote<'d>(self) -> Demoted<'a, 'd, Ctx>
where
'a: 'd,
Self: 'd,
{
Demoted(self)
}
}