resolver by reference
This commit is contained in:
parent
0fdf7532dc
commit
422275bbeb
@ -72,7 +72,7 @@ pub trait Factory<'a, Ctx: Context<'a>>: 'a + Send + Sync + Clone {
|
|||||||
fn deserialize(
|
fn deserialize(
|
||||||
&self,
|
&self,
|
||||||
deserializer: &mut dyn Deserializer,
|
deserializer: &mut dyn Deserializer,
|
||||||
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
resolver: &Rc<dyn Resolver<'a, Ctx>>,
|
||||||
addresses: &mut Addresses,
|
addresses: &mut Addresses,
|
||||||
) -> ParseResult<'a, Ctx, Self>;
|
) -> ParseResult<'a, Ctx, Self>;
|
||||||
/// Called by finite stream parsers if there's any data left.
|
/// Called by finite stream parsers if there's any data left.
|
||||||
@ -86,11 +86,11 @@ pub type ParseError<'a, Ctx, F> = <F as Factory<'a, Ctx>>::ParseError;
|
|||||||
pub type ParseErrorA<'a, Ctx, A> = ParseError<'a, Ctx, Fctr<'a, Ctx, A>>;
|
pub type ParseErrorA<'a, Ctx, A> = ParseError<'a, Ctx, Fctr<'a, Ctx, A>>;
|
||||||
|
|
||||||
/// Extension trait for factories.
|
/// Extension trait for factories.
|
||||||
pub trait ExtFactory<'a, Ctx: Context<'a>>: Factory<'a, Ctx> {
|
pub trait FactoryExt<'a, Ctx: Context<'a>>: Factory<'a, Ctx> {
|
||||||
/// Parse the object from a slice.
|
/// Parse the object from a slice.
|
||||||
fn parse_slice(
|
fn parse_slice(
|
||||||
&self,
|
&self,
|
||||||
slice: &[u8],
|
slice: &[u8],
|
||||||
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
resolver: &Rc<dyn Resolver<'a, Ctx>>,
|
||||||
) -> ParseResult<'a, Ctx, Self>;
|
) -> ParseResult<'a, Ctx, Self>;
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,7 @@ impl Addresses {
|
|||||||
fn _parse_slice<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>>(
|
fn _parse_slice<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>>(
|
||||||
factory: &A::Fctr,
|
factory: &A::Fctr,
|
||||||
slice: &[u8],
|
slice: &[u8],
|
||||||
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
resolver: &Rc<dyn Resolver<'a, Ctx>>,
|
||||||
) -> ParseResult<'a, Ctx, A::Fctr> {
|
) -> ParseResult<'a, Ctx, A::Fctr> {
|
||||||
let mut deserializer = SliceDeserializer::from(slice);
|
let mut deserializer = SliceDeserializer::from(slice);
|
||||||
let mentionable = factory.deserialize(&mut deserializer, resolver, &mut Addresses::start())?;
|
let mentionable = factory.deserialize(&mut deserializer, resolver, &mut Addresses::start())?;
|
||||||
@ -55,11 +55,11 @@ fn _parse_slice<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> ExtFactory<'a, Ctx> for F {
|
impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> FactoryExt<'a, Ctx> for F {
|
||||||
fn parse_slice(
|
fn parse_slice(
|
||||||
&self,
|
&self,
|
||||||
slice: &[u8],
|
slice: &[u8],
|
||||||
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
resolver: &Rc<dyn Resolver<'a, Ctx>>,
|
||||||
) -> ParseResult<'a, Ctx, Self> {
|
) -> ParseResult<'a, Ctx, Self> {
|
||||||
_parse_slice::<Ctx, F::Mtbl>(self, slice, resolver)
|
_parse_slice::<Ctx, F::Mtbl>(self, slice, resolver)
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ fn _resolve_origin<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>>(
|
|||||||
let (src, resolver) = resolved.map_err(ResolutionError::Lookup)?;
|
let (src, resolver) = resolved.map_err(ResolutionError::Lookup)?;
|
||||||
let mentionable = origin
|
let mentionable = origin
|
||||||
.r_factory
|
.r_factory
|
||||||
.parse_slice(&src, resolver)
|
.parse_slice(&src, &resolver)
|
||||||
.map_err(ResolutionError::Parse)?;
|
.map_err(ResolutionError::Parse)?;
|
||||||
Ok(Rc::new(mentionable))
|
Ok(Rc::new(mentionable))
|
||||||
})
|
})
|
||||||
|
@ -2,7 +2,7 @@ use std::cmp::min;
|
|||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
/// [Deserializer] for slices. Used in [`ExtFactory::parse_slice`] and [`crate::rstd::atomic::ExtAtomic::parse_slice`].
|
/// [Deserializer] for slices. Used in [`FactoryExt::parse_slice`] and [`crate::rstd::atomic::ExtAtomic::parse_slice`].
|
||||||
pub struct SliceDeserializer<'a> {
|
pub struct SliceDeserializer<'a> {
|
||||||
slice: &'a [u8],
|
slice: &'a [u8],
|
||||||
pos: usize,
|
pos: usize,
|
||||||
|
@ -37,12 +37,10 @@ fn _parse_slice<A: Atomic>(slice: &[u8]) -> Result<A, A::AParseError> {
|
|||||||
|
|
||||||
/// Extension trait to provide method-like utilities associated with [Atomic]s.
|
/// Extension trait to provide method-like utilities associated with [Atomic]s.
|
||||||
pub trait ExtAtomic: Atomic {
|
pub trait ExtAtomic: Atomic {
|
||||||
/// Static equivalent of [`ExtFactory::parse_slice`].
|
/// Static equivalent of [`FactoryExt::parse_slice`].
|
||||||
fn parse_slice(slice: &[u8]) -> Result<Self, Self::AParseError>;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<A: Atomic> ExtAtomic for A {
|
|
||||||
fn parse_slice(slice: &[u8]) -> Result<Self, Self::AParseError> {
|
fn parse_slice(slice: &[u8]) -> Result<Self, Self::AParseError> {
|
||||||
_parse_slice(slice)
|
_parse_slice(slice)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<A: Atomic> ExtAtomic for A {}
|
||||||
|
@ -75,7 +75,7 @@ impl<'a, Ctx: Context<'a>, A: Atomic> Factory<'a, Ctx> for AtomicFactory<A> {
|
|||||||
fn deserialize(
|
fn deserialize(
|
||||||
&self,
|
&self,
|
||||||
deserializer: &mut dyn Deserializer,
|
deserializer: &mut dyn Deserializer,
|
||||||
_resolver: Rc<dyn Resolver<'a, Ctx>>,
|
_resolver: &Rc<dyn Resolver<'a, Ctx>>,
|
||||||
_addresses: &mut Addresses,
|
_addresses: &mut Addresses,
|
||||||
) -> ParseResult<'a, Ctx, Self> {
|
) -> ParseResult<'a, Ctx, Self> {
|
||||||
Ok(A::a_deserialize(deserializer)?.into())
|
Ok(A::a_deserialize(deserializer)?.into())
|
||||||
@ -87,18 +87,15 @@ impl<'a, Ctx: Context<'a>, A: Atomic> Factory<'a, Ctx> for AtomicFactory<A> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Extension trait to provide method-like utilities associated with [AtomicObject]s.
|
/// Extension trait to provide method-like utilities associated with [AtomicObject]s.
|
||||||
pub trait ExtAtomicObject: Atomic {
|
pub trait AtomicObjectExt: Atomic {
|
||||||
/// Shorthand for getting specific [`AtomicFactory`].
|
/// Shorthand for getting specific [`AtomicFactory`].
|
||||||
fn f() -> AtomicFactory<Self>;
|
|
||||||
/// Shorthand for getting specific [`AtomicObject`].
|
|
||||||
fn m(self) -> AtomicObject<Self>;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<A: Atomic> ExtAtomicObject for A {
|
|
||||||
fn f() -> AtomicFactory<Self> {
|
fn f() -> AtomicFactory<Self> {
|
||||||
AtomicFactory::new()
|
AtomicFactory::new()
|
||||||
}
|
}
|
||||||
|
/// Shorthand for getting specific [`AtomicObject`].
|
||||||
fn m(self) -> AtomicObject<Self> {
|
fn m(self) -> AtomicObject<Self> {
|
||||||
self.into()
|
self.into()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<A: Atomic> AtomicObjectExt for A {}
|
||||||
|
@ -162,7 +162,7 @@ where
|
|||||||
) -> CastResult<'a, Ctx, A> {
|
) -> CastResult<'a, Ctx, A> {
|
||||||
factory.parse_slice(
|
factory.parse_slice(
|
||||||
&self.bytes(),
|
&self.bytes(),
|
||||||
map_resolver(CastResolver::rc(self.points_vec())),
|
&map_resolver(CastResolver::rc(self.points_vec())),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,14 +77,12 @@ impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for StackNodeFa
|
|||||||
fn deserialize(
|
fn deserialize(
|
||||||
&self,
|
&self,
|
||||||
deserializer: &mut dyn Deserializer,
|
deserializer: &mut dyn Deserializer,
|
||||||
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
resolver: &Rc<dyn Resolver<'a, Ctx>>,
|
||||||
addresses: &mut Addresses,
|
addresses: &mut Addresses,
|
||||||
) -> ParseResult<'a, Ctx, Self> {
|
) -> ParseResult<'a, Ctx, Self> {
|
||||||
let rest = match NullableFactory::new(self.clone()).deserialize(
|
let rest =
|
||||||
deserializer,
|
match NullableFactory::new(self.clone()).deserialize(deserializer, resolver, addresses)
|
||||||
resolver.clone(),
|
{
|
||||||
addresses,
|
|
||||||
) {
|
|
||||||
Ok(rest) => rest,
|
Ok(rest) => rest,
|
||||||
Err(ppe) => {
|
Err(ppe) => {
|
||||||
return Err(StackParseError::Point(ppe));
|
return Err(StackParseError::Point(ppe));
|
||||||
|
@ -138,15 +138,15 @@ impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for NodeFactory
|
|||||||
fn deserialize(
|
fn deserialize(
|
||||||
&self,
|
&self,
|
||||||
deserializer: &mut dyn Deserializer,
|
deserializer: &mut dyn Deserializer,
|
||||||
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
resolver: &Rc<dyn Resolver<'a, Ctx>>,
|
||||||
addresses: &mut Addresses,
|
addresses: &mut Addresses,
|
||||||
) -> ParseResult<'a, Ctx, Self> {
|
) -> ParseResult<'a, Ctx, Self> {
|
||||||
let tree_factory = TreeFactory(NullableFactory::new(self.clone()));
|
let tree_factory = TreeFactory(NullableFactory::new(self.clone()));
|
||||||
let l = tree_factory.deserialize(deserializer, resolver.clone(), addresses)?;
|
let l = tree_factory.deserialize(deserializer, resolver, addresses)?;
|
||||||
let r = tree_factory.deserialize(deserializer, resolver.clone(), addresses)?;
|
let r = tree_factory.deserialize(deserializer, resolver, addresses)?;
|
||||||
let key = self
|
let key = self
|
||||||
.0
|
.0
|
||||||
.deserialize(deserializer, resolver.clone(), addresses)
|
.deserialize(deserializer, resolver, addresses)
|
||||||
.map_err(TreeParseError::Key)?;
|
.map_err(TreeParseError::Key)?;
|
||||||
Ok(Node { l, r, key })
|
Ok(Node { l, r, key })
|
||||||
}
|
}
|
||||||
@ -168,7 +168,7 @@ impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for TreeFactory
|
|||||||
fn deserialize(
|
fn deserialize(
|
||||||
&self,
|
&self,
|
||||||
deserializer: &mut dyn Deserializer,
|
deserializer: &mut dyn Deserializer,
|
||||||
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
resolver: &Rc<dyn Resolver<'a, Ctx>>,
|
||||||
addresses: &mut Addresses,
|
addresses: &mut Addresses,
|
||||||
) -> ParseResult<'a, Ctx, Self> {
|
) -> ParseResult<'a, Ctx, Self> {
|
||||||
let node = self.0.deserialize(deserializer, resolver, addresses)?;
|
let node = self.0.deserialize(deserializer, resolver, addresses)?;
|
||||||
|
@ -146,22 +146,7 @@ pub trait CheckedParse<'a, Ctx: Context<'a>>: FixedSizeFactory<'a, Ctx> {
|
|||||||
fn deserialize_checked(
|
fn deserialize_checked(
|
||||||
&self,
|
&self,
|
||||||
deserializer: &mut dyn Deserializer,
|
deserializer: &mut dyn Deserializer,
|
||||||
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
resolver: &Rc<dyn Resolver<'a, Ctx>>,
|
||||||
addresses: &mut Addresses,
|
|
||||||
) -> CheckedParseResult<'a, Ctx, Self>;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Extension trait for factories that ensures fixed size write.
|
|
||||||
pub trait CheckedSerialize<'a, Ctx: Context<'a>>: Serializable + FixedSizeObject<'a, Ctx> {
|
|
||||||
/// Verify proper write length using [`Serializer::tell`].
|
|
||||||
fn serialize_checked(&self, serializer: &mut dyn Serializer) -> Result<(), SizeError>;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, F: FixedSizeFactory<'a, Ctx>> CheckedParse<'a, Ctx> for F {
|
|
||||||
fn deserialize_checked(
|
|
||||||
&self,
|
|
||||||
deserializer: &mut dyn Deserializer,
|
|
||||||
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
|
||||||
addresses: &mut Addresses,
|
addresses: &mut Addresses,
|
||||||
) -> CheckedParseResult<'a, Ctx, Self> {
|
) -> CheckedParseResult<'a, Ctx, Self> {
|
||||||
let expected_size = self.size();
|
let expected_size = self.size();
|
||||||
@ -180,9 +165,9 @@ impl<'a, Ctx: Context<'a>, F: FixedSizeFactory<'a, Ctx>> CheckedParse<'a, Ctx> f
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx> + FixedSizeObject<'a, Ctx>>
|
/// Extension trait for factories that ensures fixed size write.
|
||||||
CheckedSerialize<'a, Ctx> for A
|
pub trait CheckedSerialize<'a, Ctx: Context<'a>>: Serializable + FixedSizeObject<'a, Ctx> {
|
||||||
{
|
/// Verify proper write length using [`Serializer::tell`].
|
||||||
fn serialize_checked(&self, serializer: &mut dyn Serializer) -> Result<(), SizeError> {
|
fn serialize_checked(&self, serializer: &mut dyn Serializer) -> Result<(), SizeError> {
|
||||||
let expected_size = self.size();
|
let expected_size = self.size();
|
||||||
let start = serializer.tell();
|
let start = serializer.tell();
|
||||||
@ -200,6 +185,13 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx> + FixedSizeObject<'a, Ctx>>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'a, Ctx: Context<'a>, F: FixedSizeFactory<'a, Ctx>> CheckedParse<'a, Ctx> for F {}
|
||||||
|
|
||||||
|
impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx> + FixedSizeObject<'a, Ctx>>
|
||||||
|
CheckedSerialize<'a, Ctx> for A
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/// Trait useful for objects which aren't influenced by
|
/// Trait useful for objects which aren't influenced by
|
||||||
/// whether some other type (for example, a generic parameter type)
|
/// whether some other type (for example, a generic parameter type)
|
||||||
/// is fixed-size or not.
|
/// is fixed-size or not.
|
||||||
|
@ -134,11 +134,11 @@ impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> Factory<'a, Ctx>
|
|||||||
fn deserialize(
|
fn deserialize(
|
||||||
&self,
|
&self,
|
||||||
deserializer: &mut dyn Deserializer,
|
deserializer: &mut dyn Deserializer,
|
||||||
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
resolver: &Rc<dyn Resolver<'a, Ctx>>,
|
||||||
addresses: &mut Addresses,
|
addresses: &mut Addresses,
|
||||||
) -> ParseResult<'a, Ctx, Self> {
|
) -> ParseResult<'a, Ctx, Self> {
|
||||||
let (fa, fb) = SP::factories(&self.factory_data);
|
let (fa, fb) = SP::factories(&self.factory_data);
|
||||||
let a: SP::A = match fa.deserialize(deserializer, resolver.clone(), addresses) {
|
let a: SP::A = match fa.deserialize(deserializer, resolver, addresses) {
|
||||||
Ok(a) => a,
|
Ok(a) => a,
|
||||||
Err(error) => return Err(SP::from_error_a(&self.factory_data, error)),
|
Err(error) => return Err(SP::from_error_a(&self.factory_data, error)),
|
||||||
};
|
};
|
||||||
|
@ -58,7 +58,7 @@ impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for NullableFac
|
|||||||
fn deserialize(
|
fn deserialize(
|
||||||
&self,
|
&self,
|
||||||
deserializer: &mut dyn Deserializer,
|
deserializer: &mut dyn Deserializer,
|
||||||
resolver: std::rc::Rc<dyn Resolver<'a, Ctx>>,
|
resolver: &Rc<dyn Resolver<'a, Ctx>>,
|
||||||
addresses: &mut Addresses,
|
addresses: &mut Addresses,
|
||||||
) -> ParseResult<'a, Ctx, Self> {
|
) -> ParseResult<'a, Ctx, Self> {
|
||||||
let factory = self.factory.clone();
|
let factory = self.factory.clone();
|
||||||
@ -66,7 +66,7 @@ impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for NullableFac
|
|||||||
Ok(if address.point == HASH_ZEROS {
|
Ok(if address.point == HASH_ZEROS {
|
||||||
Nullable::Null(factory)
|
Nullable::Null(factory)
|
||||||
} else {
|
} else {
|
||||||
Nullable::NotNull(Point::from_address(address, factory, resolver))
|
Nullable::NotNull(Point::from_address(address, factory, resolver.clone()))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,10 +70,10 @@ impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for PointFactor
|
|||||||
fn deserialize(
|
fn deserialize(
|
||||||
&self,
|
&self,
|
||||||
deserializer: &mut dyn Deserializer,
|
deserializer: &mut dyn Deserializer,
|
||||||
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
resolver: &Rc<dyn Resolver<'a, Ctx>>,
|
||||||
addresses: &mut Addresses,
|
addresses: &mut Addresses,
|
||||||
) -> ParseResult<'a, Ctx, Self> {
|
) -> ParseResult<'a, Ctx, Self> {
|
||||||
Ok(addresses.next_point(deserializer, resolver, self.factory.clone())?)
|
Ok(addresses.next_point(deserializer, resolver.clone(), self.factory.clone())?)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn extend(&self, _mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self> {
|
fn extend(&self, _mentionable: Self::Mtbl, tail: &[u8]) -> ParseResult<'a, Ctx, Self> {
|
||||||
|
@ -20,7 +20,7 @@ trait Tde<'a, Ctx: Context<'a>>: 'a + Send + Sync {
|
|||||||
fn de(
|
fn de(
|
||||||
&self,
|
&self,
|
||||||
deserializer: &mut dyn Deserializer,
|
deserializer: &mut dyn Deserializer,
|
||||||
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
resolver: &Rc<dyn Resolver<'a, Ctx>>,
|
||||||
addresses: &mut Addresses,
|
addresses: &mut Addresses,
|
||||||
) -> TypelessParsed<'a, Ctx>;
|
) -> TypelessParsed<'a, Ctx>;
|
||||||
}
|
}
|
||||||
@ -98,7 +98,7 @@ impl<'a, Ctx: Context<'a>> Factory<'a, Ctx> for TypelessFactory<'a, Ctx> {
|
|||||||
fn deserialize(
|
fn deserialize(
|
||||||
&self,
|
&self,
|
||||||
deserializer: &mut dyn Deserializer,
|
deserializer: &mut dyn Deserializer,
|
||||||
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
resolver: &Rc<dyn Resolver<'a, Ctx>>,
|
||||||
addresses: &mut Addresses,
|
addresses: &mut Addresses,
|
||||||
) -> ParseResult<'a, Ctx, Self> {
|
) -> ParseResult<'a, Ctx, Self> {
|
||||||
match self.t_deserialize.de(deserializer, resolver, addresses) {
|
match self.t_deserialize.de(deserializer, resolver, addresses) {
|
||||||
@ -140,7 +140,7 @@ where
|
|||||||
fn de(
|
fn de(
|
||||||
&self,
|
&self,
|
||||||
deserializer: &mut dyn Deserializer,
|
deserializer: &mut dyn Deserializer,
|
||||||
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
resolver: &Rc<dyn Resolver<'a, Ctx>>,
|
||||||
addresses: &mut Addresses,
|
addresses: &mut Addresses,
|
||||||
) -> TypelessParsed<'a, Ctx> {
|
) -> TypelessParsed<'a, Ctx> {
|
||||||
self.deserialize(deserializer, resolver, addresses)
|
self.deserialize(deserializer, resolver, addresses)
|
||||||
|
Loading…
Reference in New Issue
Block a user