remove hex dep
	
		
			
	
		
	
	
				
					
				
			This commit is contained in:
		
							parent
							
								
									a43f1dbf27
								
							
						
					
					
						commit
						dc229363af
					
				| @ -10,7 +10,6 @@ members = ["radn-derive"] | ||||
| 
 | ||||
| [workspace.dependencies] | ||||
| futures = "0.3.26" | ||||
| hex = "0.4.3" | ||||
| sha2 = "0.10.6" | ||||
| rand = "0.8.5" | ||||
| quote = "1" | ||||
| @ -18,7 +17,6 @@ syn = "2" | ||||
| 
 | ||||
| [dependencies] | ||||
| futures.workspace = true | ||||
| hex.workspace = true | ||||
| radn-derive.path = "radn-derive" | ||||
| 
 | ||||
| [dev-dependencies] | ||||
|  | ||||
							
								
								
									
										19
									
								
								src/rstd.rs
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								src/rstd.rs
									
									
									
									
									
								
							| @ -22,9 +22,26 @@ use crate::func::*; | ||||
| use crate::mode::*; | ||||
| 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 { | ||||
|     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, | ||||
|                 "address mismatch at index {}: {}!={}", | ||||
|                 index, | ||||
|                 hex::encode(expected), | ||||
|                 hex::encode(received), | ||||
|                 hex(expected), | ||||
|                 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>> { | ||||
|     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> { | ||||
|     pub fn from_mentionable<A: Mentionable<'a, Ctx>>(a: &A) -> Self { | ||||
|         let mut points = Vec::new(); | ||||
|         a.points_typed(&mut 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> { | ||||
|     fn resolve(self: Arc<Self>, address: Address) -> HashResolution<'a, Ctx> { | ||||
|         let point = self.points.get(address.index).unwrap_or_else(|| { | ||||
|             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() | ||||
|         self.resolve_robust(address).unwrap() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user