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 { |     fn extension_error(&self, tail: &[u8]) -> Self::ParseError { | ||||||
|         StackParseError::Element(self.element_factory.extension_error(tail)) |         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> | 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, |         self, | ||||||
|         factory: A::Fctr, |         factory: A::Fctr, | ||||||
|         err: impl FnOnce(&[u8]) -> E, |         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>> { | 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>( |     fn iresolver(&self) -> Rc<dyn Resolver<'a, Ctx>> { | ||||||
|         self, |         self.dectx.resolver() | ||||||
|         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, |  | ||||||
|         )) |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -98,6 +98,8 @@ pub type IParseResult<'a, Ctx, F, I> = | |||||||
| /// This factory should return an error on EOF.
 | /// This factory should return an error on EOF.
 | ||||||
| pub trait InlineableFactory<'a, Ctx: Context<'a>>: Factory<'a, Ctx> { | pub trait InlineableFactory<'a, Ctx: Context<'a>>: Factory<'a, Ctx> { | ||||||
|     fn extension_error(&self, tail: &[u8]) -> Self::ParseError; |     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.
 | /// 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 { |     fn extension_error(&self, tail: &[u8]) -> Self::ParseError { | ||||||
|         A::a_extension_error(tail) |         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> { | 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 { |     fn extension_error(&self, tail: &[u8]) -> Self::ParseError { | ||||||
|         PointParseError::WrongLength(HASH_SIZE + tail.len()) |         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> { | impl<F> AlwaysConstSize for PointFactory<F> { | ||||||
|  | |||||||
| @ -163,6 +163,22 @@ where | |||||||
|         let (_, fb) = SP::factories(&self.factory_data); |         let (_, fb) = SP::factories(&self.factory_data); | ||||||
|         SP::from_error_b(&self.factory_data, fb.extension_error(tail)) |         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> | 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 { |     fn extension_error(&self, tail: &[u8]) -> Self::ParseError { | ||||||
|         PointParseError::WrongLength(HASH_SIZE + tail.len()) |         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> { | impl<F> AlwaysConstSize for NullableFactory<F> { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user