InlineableFactory::ideserialize
				
					
				
			This commit is contained in:
		
							parent
							
								
									ba33f82ecb
								
							
						
					
					
						commit
						19a55bf626
					
				| @ -167,6 +167,17 @@ impl<'a, Ctx: Context<'a>, F: InlineableFactory<'a, Ctx>> InlineableFactory<'a, | ||||
|     fn extension_error(&self, tail: &[u8]) -> Self::ParseError { | ||||
|         StackParseError::Element(self.element_factory.extension_error(tail)) | ||||
|     } | ||||
| 
 | ||||
|     fn ideserialize<I: InCtx<'a, Ctx>>(&self, inctx: I) -> IParseResult<'a, Ctx, Self, I> { | ||||
|         let (rest, inctx) = NullableFactory::new(self.clone()) | ||||
|             .ideserialize(inctx) | ||||
|             .map_err(StackParseError::Point)?; | ||||
|         let (element, inctx) = self | ||||
|             .element_factory | ||||
|             .ideserialize(inctx) | ||||
|             .map_err(StackParseError::Element)?; | ||||
|         Ok((StackNode { rest, element }, inctx)) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<'a, Ctx: Context<'a>, F: FixedSizeFactory<'a, Ctx>> FixedSizeFactory<'a, Ctx> | ||||
|  | ||||
| @ -41,7 +41,15 @@ pub trait InCtx<'a, Ctx: Context<'a>>: Inlining { | ||||
|         self, | ||||
|         factory: A::Fctr, | ||||
|         err: impl FnOnce(&[u8]) -> E, | ||||
|     ) -> Result<(Point<'a, Ctx, A>, Self), 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) -> Rc<dyn Resolver<'a, Ctx>>; | ||||
| } | ||||
| 
 | ||||
| struct InCtxT<'a: 'c, 'c, Ctx: Context<'a>> { | ||||
| @ -79,16 +87,8 @@ impl<'a: 'c, 'c, Ctx: Context<'a>> InCtx<'a, Ctx> for InCtxT<'a, 'c, Ctx> { | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     fn icnext_point<'b, A: Mentionable<'a, Ctx>, 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.dectx.resolver()), | ||||
|             inctx, | ||||
|         )) | ||||
|     fn iresolver(&self) -> Rc<dyn Resolver<'a, Ctx>> { | ||||
|         self.dectx.resolver() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -98,6 +98,8 @@ pub type IParseResult<'a, Ctx, F, I> = | ||||
| /// This factory should return an error on EOF.
 | ||||
| pub trait InlineableFactory<'a, Ctx: Context<'a>>: Factory<'a, Ctx> { | ||||
|     fn extension_error(&self, tail: &[u8]) -> Self::ParseError; | ||||
| 
 | ||||
|     fn ideserialize<I: InCtx<'a, Ctx>>(&self, inctx: I) -> IParseResult<'a, Ctx, Self, I>; | ||||
| } | ||||
| 
 | ||||
| /// This factory always reads the same amount of bytes or returns error.
 | ||||
| @ -149,6 +151,11 @@ impl<'a, Ctx: Context<'a>, A: InlineableAtomic> InlineableFactory<'a, Ctx> for A | ||||
|     fn extension_error(&self, tail: &[u8]) -> Self::ParseError { | ||||
|         A::a_extension_error(tail) | ||||
|     } | ||||
| 
 | ||||
|     fn ideserialize<I: InCtx<'a, Ctx>>(&self, inctx: I) -> IParseResult<'a, Ctx, Self, I> { | ||||
|         let (a, inctx) = A::a_ideserialize(inctx)?; | ||||
|         Ok((a.into(), inctx)) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<'a, Ctx: Context<'a>, A: ConstSizeAtomic> FixedSizeFactory<'a, Ctx> for AtomicFactory<A> { | ||||
| @ -315,6 +322,10 @@ impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> InlineableFactory<'a, Ctx> for P | ||||
|     fn extension_error(&self, tail: &[u8]) -> Self::ParseError { | ||||
|         PointParseError::WrongLength(HASH_SIZE + tail.len()) | ||||
|     } | ||||
| 
 | ||||
|     fn ideserialize<I: InCtx<'a, Ctx>>(&self, inctx: I) -> IParseResult<'a, Ctx, Self, I> { | ||||
|         inctx.icnext_point(self.inner(), |slice| PointParseError::from(slice)) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<F> AlwaysConstSize for PointFactory<F> { | ||||
|  | ||||
| @ -163,6 +163,22 @@ where | ||||
|         let (_, fb) = SP::factories(&self.factory_data); | ||||
|         SP::from_error_b(&self.factory_data, fb.extension_error(tail)) | ||||
|     } | ||||
| 
 | ||||
|     fn ideserialize<I: InCtx<'a, Ctx>>(&self, inctx: I) -> IParseResult<'a, Ctx, Self, I> { | ||||
|         let (fa, fb) = SP::factories(&self.factory_data); | ||||
|         let (a, inctx) = fa | ||||
|             .ideserialize(inctx) | ||||
|             .map_err(|e| SP::from_error_a(&self.factory_data, e))?; | ||||
|         let (b, inctx) = fb | ||||
|             .ideserialize(inctx) | ||||
|             .map_err(|e| SP::from_error_b(&self.factory_data, e))?; | ||||
|         Ok(( | ||||
|             StaticPairObject { | ||||
|                 pair: SP::from_parsed(&self.factory_data, a, b), | ||||
|             }, | ||||
|             inctx, | ||||
|         )) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> FixedSizeFactory<'a, Ctx> | ||||
|  | ||||
| @ -115,6 +115,19 @@ impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> InlineableFactory<'a, Ctx> for N | ||||
|     fn extension_error(&self, tail: &[u8]) -> Self::ParseError { | ||||
|         PointParseError::WrongLength(HASH_SIZE + tail.len()) | ||||
|     } | ||||
| 
 | ||||
|     fn ideserialize<I: InCtx<'a, Ctx>>(&self, inctx: I) -> IParseResult<'a, Ctx, Self, I> { | ||||
|         let factory = self.factory.clone(); | ||||
|         let (address, inctx) = inctx.icnext_address(|slice| PointParseError::from(slice))?; | ||||
|         Ok(( | ||||
|             if address.point == HASH_ZEROS { | ||||
|                 Nullable::Null(factory) | ||||
|             } else { | ||||
|                 Nullable::NotNull(Point::from_address(address, factory, inctx.iresolver())) | ||||
|             }, | ||||
|             inctx, | ||||
|         )) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl<F> AlwaysConstSize for NullableFactory<F> { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user