remove hex
dep
This commit is contained in:
parent
a43f1dbf27
commit
dc229363af
@ -10,7 +10,6 @@ members = ["radn-derive"]
|
|||||||
|
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
futures = "0.3.26"
|
futures = "0.3.26"
|
||||||
hex = "0.4.3"
|
|
||||||
sha2 = "0.10.6"
|
sha2 = "0.10.6"
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
quote = "1"
|
quote = "1"
|
||||||
@ -18,7 +17,6 @@ syn = "2"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
futures.workspace = true
|
futures.workspace = true
|
||||||
hex.workspace = true
|
|
||||||
radn-derive.path = "radn-derive"
|
radn-derive.path = "radn-derive"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
19
src/rstd.rs
19
src/rstd.rs
@ -22,9 +22,26 @@ use crate::func::*;
|
|||||||
use crate::mode::*;
|
use crate::mode::*;
|
||||||
use crate::rcore::*;
|
use crate::rcore::*;
|
||||||
|
|
||||||
|
struct Hex<'a> {
|
||||||
|
point: &'a Hash,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Display for Hex<'_> {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
for byte in self.point {
|
||||||
|
write!(f, "{byte:02x}")?
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn hex(point: &Hash) -> impl '_ + Display {
|
||||||
|
Hex { point }
|
||||||
|
}
|
||||||
|
|
||||||
impl Display for Address {
|
impl Display for Address {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
write!(f, "{}@{}", hex::encode(self.point), self.index)
|
write!(f, "{}@{}", hex(&self.point), self.index)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,8 +69,8 @@ impl<'a> Display for CastError<'a> {
|
|||||||
f,
|
f,
|
||||||
"address mismatch at index {}: {}!={}",
|
"address mismatch at index {}: {}!={}",
|
||||||
index,
|
index,
|
||||||
hex::encode(expected),
|
hex(expected),
|
||||||
hex::encode(received),
|
hex(received),
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,36 +20,91 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> SingularResolution<'a, Ctx>
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// ```rust
|
||||||
|
/// # use radn::rcore::Context;
|
||||||
|
/// # use radn::rcore::Factory;
|
||||||
|
/// # use radn::rcore::FactoryExt;
|
||||||
|
/// # use radn::rcore::Mentionable;
|
||||||
|
/// # use radn::rstd::ResolverExt;
|
||||||
|
/// # use radn::rstd::SerializableExt;
|
||||||
|
/// # use radn::rstd::singular::SingularResolver;
|
||||||
|
/// # fn test<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>>(a: &A) {
|
||||||
|
/// let resolver = SingularResolver::from_mentionable(a).into_rc();
|
||||||
|
/// let bytes = a.bytes();
|
||||||
|
/// let factory = a.factory();
|
||||||
|
/// factory.parse_slice(&bytes, &resolver);
|
||||||
|
/// # }
|
||||||
|
/// ```
|
||||||
pub struct SingularResolver<'a, Ctx: Context<'a>> {
|
pub struct SingularResolver<'a, Ctx: Context<'a>> {
|
||||||
points: Vec<Arc<dyn SingularResolution<'a, Ctx>>>,
|
points: Vec<Arc<dyn SingularResolution<'a, Ctx>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum SingularityError {
|
||||||
|
OutOfBounds {
|
||||||
|
index: usize,
|
||||||
|
len: usize,
|
||||||
|
},
|
||||||
|
Mismatch {
|
||||||
|
index: usize,
|
||||||
|
expected: Hash,
|
||||||
|
point: Hash,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Display for SingularityError {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
match self {
|
||||||
|
Self::OutOfBounds { index, len } => {
|
||||||
|
write!(f, "singularity out-of-bounds: {index}/{len}")
|
||||||
|
}
|
||||||
|
Self::Mismatch {
|
||||||
|
index,
|
||||||
|
expected,
|
||||||
|
point,
|
||||||
|
} => write!(
|
||||||
|
f,
|
||||||
|
"address mismatch at index {index}: {}!={}",
|
||||||
|
hex(expected),
|
||||||
|
hex(point),
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a>> SingularResolver<'a, Ctx> {
|
impl<'a, Ctx: Context<'a>> SingularResolver<'a, Ctx> {
|
||||||
pub fn from_mentionable<A: Mentionable<'a, Ctx>>(a: &A) -> Self {
|
pub fn from_mentionable<A: Mentionable<'a, Ctx>>(a: &A) -> Self {
|
||||||
let mut points = Vec::new();
|
let mut points = Vec::new();
|
||||||
a.points_typed(&mut points);
|
a.points_typed(&mut points);
|
||||||
Self { points }
|
Self { points }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn resolve_robust(
|
||||||
|
self: Arc<Self>,
|
||||||
|
address: Address,
|
||||||
|
) -> Result<HashResolution<'a, Ctx>, SingularityError> {
|
||||||
|
let point =
|
||||||
|
self.points
|
||||||
|
.get(address.index)
|
||||||
|
.ok_or_else(|| SingularityError::OutOfBounds {
|
||||||
|
index: address.index,
|
||||||
|
len: self.points.len(),
|
||||||
|
})?;
|
||||||
|
if point.s_hash() != address.point {
|
||||||
|
Err(SingularityError::Mismatch {
|
||||||
|
index: address.index,
|
||||||
|
expected: address.point,
|
||||||
|
point: point.s_hash(),
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
Ok(point.clone().singular())
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, Ctx: Context<'a>> Resolver<'a, Ctx> for SingularResolver<'a, Ctx> {
|
impl<'a, Ctx: Context<'a>> Resolver<'a, Ctx> for SingularResolver<'a, Ctx> {
|
||||||
fn resolve(self: Arc<Self>, address: Address) -> HashResolution<'a, Ctx> {
|
fn resolve(self: Arc<Self>, address: Address) -> HashResolution<'a, Ctx> {
|
||||||
let point = self.points.get(address.index).unwrap_or_else(|| {
|
self.resolve_robust(address).unwrap()
|
||||||
panic!(
|
|
||||||
"singularity out-of-bounds: {}/{}",
|
|
||||||
address.index,
|
|
||||||
self.points.len()
|
|
||||||
)
|
|
||||||
});
|
|
||||||
if point.s_hash() != address.point {
|
|
||||||
panic!(
|
|
||||||
"address mismatch at index {}: {}!={}",
|
|
||||||
address.index,
|
|
||||||
hex::encode(address.point),
|
|
||||||
hex::encode(point.s_hash()),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
point.clone().singular()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user