extract addresses
This commit is contained in:
parent
0cbb98ac84
commit
1aa0cff0b6
@ -0,0 +1,66 @@
|
||||
use super::*;
|
||||
|
||||
/// Preferred way to parse [Point]s off of a [Serializer].
|
||||
pub struct Addresses {
|
||||
current: usize,
|
||||
}
|
||||
|
||||
impl Addresses {
|
||||
/// Read the next [Address].
|
||||
pub fn next<'a>(
|
||||
&mut self,
|
||||
deserializer: &'a mut dyn Deserializer,
|
||||
) -> Result<Address, &'a [u8]> {
|
||||
let point = deserializer.read_n_const::<HASH_SIZE>()?;
|
||||
let address = Address {
|
||||
point,
|
||||
index: self.current,
|
||||
};
|
||||
self.current += 1;
|
||||
Ok(address)
|
||||
}
|
||||
|
||||
/// Read the next [Point].
|
||||
pub fn next_point<'a, 'b, Ctx: 'a + Context, A: Mentionable<'a, Ctx>>(
|
||||
&mut self,
|
||||
deserializer: &'b mut dyn Deserializer,
|
||||
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
||||
factory: A::Fctr,
|
||||
) -> Result<Point<'a, Ctx, A>, &'b [u8]> {
|
||||
Ok(Point::from_address(
|
||||
self.next(deserializer)?,
|
||||
factory,
|
||||
resolver,
|
||||
))
|
||||
}
|
||||
|
||||
/// Start reading the [Address]es.
|
||||
fn start() -> Self {
|
||||
Addresses { current: 0 }
|
||||
}
|
||||
}
|
||||
|
||||
fn _parse_slice<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>>(
|
||||
factory: &A::Fctr,
|
||||
slice: &[u8],
|
||||
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
||||
) -> ParseResult<'a, Ctx, A::Fctr> {
|
||||
let mut deserializer = SliceDeserializer::from(slice);
|
||||
let mentionable = factory.deserialize(&mut deserializer, resolver, &mut Addresses::start())?;
|
||||
let tail = deserializer.read_all();
|
||||
if tail.is_empty() {
|
||||
Ok(mentionable)
|
||||
} else {
|
||||
Err(factory.unexpected_tail(tail))
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, Ctx: 'a + Context, F: Factory<'a, Ctx>> ExtFactory<'a, Ctx> for F {
|
||||
fn parse_slice(
|
||||
&self,
|
||||
slice: &[u8],
|
||||
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
||||
) -> ParseResult<'a, Ctx, Self> {
|
||||
_parse_slice::<Ctx, F::Mtbl>(self, slice, resolver)
|
||||
}
|
||||
}
|
@ -1,3 +1,6 @@
|
||||
#[cfg(doc)]
|
||||
use super::*;
|
||||
|
||||
/// Fixed [type@Hash] length.
|
||||
pub const HASH_SIZE: usize = 32;
|
||||
|
||||
|
@ -40,68 +40,3 @@ pub trait Resolver<'a, Ctx: 'a + Context>: 'a {
|
||||
/// with topology header ([`Mentionable::topology()`]) omitted.
|
||||
fn resolve(self: Rc<Self>, address: Address) -> HashResolution<'a, Ctx>;
|
||||
}
|
||||
|
||||
/// Preferred way to parse [Point]s off of a [Serializer].
|
||||
pub struct Addresses {
|
||||
current: usize,
|
||||
}
|
||||
|
||||
impl Addresses {
|
||||
/// Read the next [Address].
|
||||
pub fn next<'a>(
|
||||
&mut self,
|
||||
deserializer: &'a mut dyn Deserializer,
|
||||
) -> Result<Address, &'a [u8]> {
|
||||
let point = deserializer.read_n_const::<HASH_SIZE>()?;
|
||||
let address = Address {
|
||||
point,
|
||||
index: self.current,
|
||||
};
|
||||
self.current += 1;
|
||||
Ok(address)
|
||||
}
|
||||
|
||||
/// Read the next [Point].
|
||||
pub fn next_point<'a, 'b, Ctx: 'a + Context, A: Mentionable<'a, Ctx>>(
|
||||
&mut self,
|
||||
deserializer: &'b mut dyn Deserializer,
|
||||
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
||||
factory: A::Fctr,
|
||||
) -> Result<Point<'a, Ctx, A>, &'b [u8]> {
|
||||
Ok(Point::from_address(
|
||||
self.next(deserializer)?,
|
||||
factory,
|
||||
resolver,
|
||||
))
|
||||
}
|
||||
|
||||
/// Start reading the [Address]es.
|
||||
fn start() -> Self {
|
||||
Addresses { current: 0 }
|
||||
}
|
||||
}
|
||||
|
||||
fn _parse_slice<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>>(
|
||||
factory: &A::Fctr,
|
||||
slice: &[u8],
|
||||
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
||||
) -> ParseResult<'a, Ctx, A::Fctr> {
|
||||
let mut deserializer = SliceDeserializer::from(slice);
|
||||
let mentionable = factory.deserialize(&mut deserializer, resolver, &mut Addresses::start())?;
|
||||
let tail = deserializer.read_all();
|
||||
if tail.is_empty() {
|
||||
Ok(mentionable)
|
||||
} else {
|
||||
Err(factory.unexpected_tail(tail))
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, Ctx: 'a + Context, F: Factory<'a, Ctx>> ExtFactory<'a, Ctx> for F {
|
||||
fn parse_slice(
|
||||
&self,
|
||||
slice: &[u8],
|
||||
resolver: Rc<dyn Resolver<'a, Ctx>>,
|
||||
) -> ParseResult<'a, Ctx, Self> {
|
||||
_parse_slice::<Ctx, F::Mtbl>(self, slice, resolver)
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,6 @@
|
||||
#[cfg(doc)]
|
||||
use super::*;
|
||||
|
||||
/// Serialisation mechanism that is chosen over bytestring concatenation
|
||||
/// both for performance and simplicity.
|
||||
///
|
||||
|
Loading…
Reference in New Issue
Block a user