FactoryBase
				
					
				
			This commit is contained in:
		
							parent
							
								
									c01963809e
								
							
						
					
					
						commit
						f1b4e7b88e
					
				
							
								
								
									
										19
									
								
								src/rcore.rs
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								src/rcore.rs
									
									
									
									
									
								
							| @ -67,19 +67,22 @@ pub trait Mentionable<'a, Ctx: Context<'a>>: 'a + Serializable { | |||||||
| pub type Fctr<'a, Ctx, A> = <A as Mentionable<'a, Ctx>>::Fctr; | pub type Fctr<'a, Ctx, A> = <A as Mentionable<'a, Ctx>>::Fctr; | ||||||
| 
 | 
 | ||||||
| /// Shorthand for the type of vaalues returned by [`Factory::deserialize`].
 | /// Shorthand for the type of vaalues returned by [`Factory::deserialize`].
 | ||||||
| pub type ParseResult<'a, Ctx, F> = Result<Mtbl<'a, Ctx, F>, <F as Factory<'a, Ctx>>::ParseError>; | pub type ParseResult<'a, Ctx, F> = Result<Mtbl<'a, Ctx, F>, ParseError<'a, Ctx, F>>; | ||||||
| 
 | 
 | ||||||
| /// [`ParseResult`] associated with a [`Mentionable`] (instead of a [`Factory`]).
 | /// [`ParseResult`] associated with a [`Mentionable`] (instead of a [`Factory`]).
 | ||||||
| pub type ParseResultA<'a, Ctx, A> = Result<A, ParseErrorA<'a, Ctx, A>>; | pub type ParseResultA<'a, Ctx, A> = Result<A, ParseErrorA<'a, Ctx, A>>; | ||||||
| 
 | 
 | ||||||
| /// Trait representing deserialisation rules for [Mentionable]s.
 | /// [Factory] base.
 | ||||||
| /// Crucial for [`crate::rstd::typeless`].
 | pub trait FactoryBase<'a, Ctx: Context<'a>>: 'a + Send + Sync + Clone { | ||||||
| pub trait Factory<'a, Ctx: Context<'a>>: 'a + Send + Sync + Clone { |  | ||||||
|     /// Type of the associated objects.
 |     /// Type of the associated objects.
 | ||||||
|     type Mtbl: Mentionable<'a, Ctx, Fctr = Self>; |     type Mtbl: Mentionable<'a, Ctx, Fctr = Self>; | ||||||
|     /// Type of an error that [`Factory::deserialize`] can fail with.
 |     /// Type of an error that [`Factory::deserialize`] can fail with.
 | ||||||
|     type ParseError: 'a + Error; |     type ParseError: 'a + Error; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
|  | /// Trait representing deserialisation rules for [Mentionable]s.
 | ||||||
|  | /// Crucial for [`crate::rstd::typeless`].
 | ||||||
|  | pub trait Factory<'a, Ctx: Context<'a>>: FactoryBase<'a, Ctx> { | ||||||
|     /// See [`Deserializer`], [`Resolver`].
 |     /// See [`Deserializer`], [`Resolver`].
 | ||||||
|     fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self>; |     fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self>; | ||||||
|     /// Called by finite stream parsers if there's any data left.
 |     /// Called by finite stream parsers if there's any data left.
 | ||||||
| @ -87,12 +90,12 @@ pub trait Factory<'a, Ctx: Context<'a>>: 'a + Send + Sync + Clone { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// [`Mentionable`] associated with the [`Factory`]. Mostly useful for `type` definitions.
 | /// [`Mentionable`] associated with the [`Factory`]. Mostly useful for `type` definitions.
 | ||||||
| pub type Mtbl<'a, Ctx, F> = <F as Factory<'a, Ctx>>::Mtbl; | pub type Mtbl<'a, Ctx, F> = <F as FactoryBase<'a, Ctx>>::Mtbl; | ||||||
| 
 | 
 | ||||||
| /// [`Factory::ParseError`]. Mostly useful for `type` definitions.
 | /// [`FactoryBase::ParseError`]. Mostly useful for `type` definitions.
 | ||||||
| pub type ParseError<'a, Ctx, F> = <F as Factory<'a, Ctx>>::ParseError; | pub type ParseError<'a, Ctx, F> = <F as FactoryBase<'a, Ctx>>::ParseError; | ||||||
| 
 | 
 | ||||||
| /// [`Factory::ParseError`] associated with the [`Mentionable`].
 | /// [`FactoryBase::ParseError`] associated with the [`Mentionable`].
 | ||||||
| /// Mostly useful for `type` definitions.
 | /// Mostly useful for `type` definitions.
 | ||||||
| pub type ParseErrorA<'a, Ctx, A> = ParseError<'a, Ctx, Fctr<'a, Ctx, A>>; | pub type ParseErrorA<'a, Ctx, A> = ParseError<'a, Ctx, Fctr<'a, Ctx, A>>; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -19,7 +19,7 @@ pub type AParseResult<A> = Result<A, <A as Atomic>::AParseError>; | |||||||
| /// while limiting [`Mentionable::points_typed`] (and corresponding [`Mentionable::topology`])
 | /// while limiting [`Mentionable::points_typed`] (and corresponding [`Mentionable::topology`])
 | ||||||
| /// to an empty sequence.
 | /// to an empty sequence.
 | ||||||
| pub trait Atomic: 'static + Send + Sync + Send + Clone + Serializable { | pub trait Atomic: 'static + Send + Sync + Send + Clone + Serializable { | ||||||
|     /// Equivalent of [`Factory::ParseError`].
 |     /// Equivalent of [`FactoryBase::ParseError`].
 | ||||||
|     type AParseError: Error; |     type AParseError: Error; | ||||||
|     /// Static equivalent of [`Factory::deserialize`].
 |     /// Static equivalent of [`Factory::deserialize`].
 | ||||||
|     fn a_deserialize(inlining: impl Inlining) -> AParseResult<Self>; |     fn a_deserialize(inlining: impl Inlining) -> AParseResult<Self>; | ||||||
|  | |||||||
| @ -67,11 +67,13 @@ impl<A: Atomic> Clone for AtomicFactory<A> { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl<'a, Ctx: Context<'a>, A: Atomic> Factory<'a, Ctx> for AtomicFactory<A> { | impl<'a, Ctx: Context<'a>, A: Atomic> FactoryBase<'a, Ctx> for AtomicFactory<A> { | ||||||
|     type Mtbl = AtomicObject<A>; |     type Mtbl = AtomicObject<A>; | ||||||
| 
 | 
 | ||||||
|     type ParseError = A::AParseError; |     type ParseError = A::AParseError; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
|  | impl<'a, Ctx: Context<'a>, A: Atomic> Factory<'a, Ctx> for AtomicFactory<A> { | ||||||
|     fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { |     fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { | ||||||
|         Ok(A::a_deserialize(inctx)?.into()) |         Ok(A::a_deserialize(inctx)?.into()) | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -15,7 +15,7 @@ struct CastResolver<'a, Ctx: Context<'a>> { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// Used to represent errors that might arise during resolution/parsion.
 | /// Used to represent errors that might arise during resolution/parsion.
 | ||||||
| /// Is expected to be classified as [`Context::LookupError`] rather than [`Factory::ParseError`].
 | /// Is expected to be classified as [`Context::LookupError`] rather than [`FactoryBase::ParseError`].
 | ||||||
| /// [`CastError::AddressIndexOutOfBounds`] and [`CastError::AddressPointMismatch`]
 | /// [`CastError::AddressIndexOutOfBounds`] and [`CastError::AddressPointMismatch`]
 | ||||||
| /// variants generally shouldn't happen.
 | /// variants generally shouldn't happen.
 | ||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
|  | |||||||
| @ -87,11 +87,13 @@ impl<F> StackNodeFactory<F> { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for StackNodeFactory<F> { | impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> FactoryBase<'a, Ctx> for StackNodeFactory<F> { | ||||||
|     type Mtbl = StackNode<'a, Ctx, F::Mtbl>; |     type Mtbl = StackNode<'a, Ctx, F::Mtbl>; | ||||||
| 
 | 
 | ||||||
|     type ParseError = StackParseError<ParseError<'a, Ctx, F>>; |     type ParseError = StackParseError<ParseError<'a, Ctx, F>>; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
|  | impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for StackNodeFactory<F> { | ||||||
|     fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { |     fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { | ||||||
|         let (rest, inctx) = self.parse_point(inctx)?; |         let (rest, inctx) = self.parse_point(inctx)?; | ||||||
|         let element = self |         let element = self | ||||||
|  | |||||||
| @ -131,11 +131,13 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> Mentionable<'a, Ctx> for Tre | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for NodeFactory<F> { | impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> FactoryBase<'a, Ctx> for NodeFactory<F> { | ||||||
|     type Mtbl = Node<'a, Ctx, F::Mtbl>; |     type Mtbl = Node<'a, Ctx, F::Mtbl>; | ||||||
| 
 | 
 | ||||||
|     type ParseError = TreeParseError<F::ParseError>; |     type ParseError = TreeParseError<F::ParseError>; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
|  | impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for NodeFactory<F> { | ||||||
|     fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { |     fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { | ||||||
|         let tree_factory = TreeFactory(NullableFactory::new(self.clone())); |         let tree_factory = TreeFactory(NullableFactory::new(self.clone())); | ||||||
|         let (l, inctx) = tree_factory.ideserialize(inctx)?; |         let (l, inctx) = tree_factory.ideserialize(inctx)?; | ||||||
| @ -153,11 +155,13 @@ impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for NodeFactory | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for TreeFactory<F> { | impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> FactoryBase<'a, Ctx> for TreeFactory<F> { | ||||||
|     type Mtbl = Tree<'a, Ctx, F::Mtbl>; |     type Mtbl = Tree<'a, Ctx, F::Mtbl>; | ||||||
| 
 | 
 | ||||||
|     type ParseError = TreeParseError<F::ParseError>; |     type ParseError = TreeParseError<F::ParseError>; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
|  | impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for TreeFactory<F> { | ||||||
|     fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { |     fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { | ||||||
|         self.ideserialize(inctx).seal() |         self.ideserialize(inctx).seal() | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -10,8 +10,7 @@ use super::{ | |||||||
|     *, |     *, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| pub type IParseResult<'a, Ctx, F, I> = | pub type IParseResult<'a, Ctx, F, I> = Result<(Mtbl<'a, Ctx, F>, I), ParseError<'a, Ctx, F>>; | ||||||
|     Result<(Mtbl<'a, Ctx, F>, I), <F as Factory<'a, Ctx>>::ParseError>; |  | ||||||
| 
 | 
 | ||||||
| /// 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> { | ||||||
| @ -126,7 +125,7 @@ impl Display for SizeError { | |||||||
| 
 | 
 | ||||||
| impl Error for SizeError {} | impl Error for SizeError {} | ||||||
| 
 | 
 | ||||||
| /// Wrapper for [`SizeError`]/[`Factory::ParseError`].
 | /// Wrapper for [`SizeError`]/[`FactoryBase::ParseError`].
 | ||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
| pub enum CheckedParseError<P: Error> { | pub enum CheckedParseError<P: Error> { | ||||||
|     Parse(P), |     Parse(P), | ||||||
|  | |||||||
| @ -41,7 +41,7 @@ pub trait StaticPair<'a, Ctx: Context<'a>>: | |||||||
|     type FA: Factory<'a, Ctx, Mtbl = Self::A> + InlineableFactory<'a, Ctx>; |     type FA: Factory<'a, Ctx, Mtbl = Self::A> + InlineableFactory<'a, Ctx>; | ||||||
|     /// Second element's factory.
 |     /// Second element's factory.
 | ||||||
|     type FB: Factory<'a, Ctx, Mtbl = Self::B>; |     type FB: Factory<'a, Ctx, Mtbl = Self::B>; | ||||||
|     /// See [Factory::ParseError].
 |     /// See [`FactoryBase::ParseError`].
 | ||||||
|     type ParseError: 'a + Error; |     type ParseError: 'a + Error; | ||||||
| 
 | 
 | ||||||
|     /// Borrow both elements' factories.
 |     /// Borrow both elements' factories.
 | ||||||
| @ -124,13 +124,17 @@ impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> Clone for StaticPairFactory< | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> Factory<'a, Ctx> | impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> FactoryBase<'a, Ctx> | ||||||
|     for StaticPairFactory<'a, Ctx, SP> |     for StaticPairFactory<'a, Ctx, SP> | ||||||
| { | { | ||||||
|     type Mtbl = StaticPairObject<SP>; |     type Mtbl = StaticPairObject<SP>; | ||||||
| 
 | 
 | ||||||
|     type ParseError = SP::ParseError; |     type ParseError = SP::ParseError; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
|  | impl<'a, Ctx: Context<'a>, SP: StaticPair<'a, Ctx>> Factory<'a, Ctx> | ||||||
|  |     for StaticPairFactory<'a, Ctx, SP> | ||||||
|  | { | ||||||
|     fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { |     fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { | ||||||
|         let (fa, fb) = SP::factories(&self.factory_data); |         let (fa, fb) = SP::factories(&self.factory_data); | ||||||
|         let (a, inctx) = fa |         let (a, inctx) = fa | ||||||
|  | |||||||
| @ -50,11 +50,13 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> Mentionable<'a, Ctx> for Nul | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for NullableFactory<F> { | impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> FactoryBase<'a, Ctx> for NullableFactory<F> { | ||||||
|     type Mtbl = Nullable<'a, Ctx, F::Mtbl>; |     type Mtbl = Nullable<'a, Ctx, F::Mtbl>; | ||||||
| 
 | 
 | ||||||
|     type ParseError = PointParseError; |     type ParseError = PointParseError; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
|  | impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for NullableFactory<F> { | ||||||
|     fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { |     fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { | ||||||
|         self.ideserialize(inctx).seal() |         self.ideserialize(inctx).seal() | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -68,11 +68,13 @@ impl<'a, Ctx: Context<'a>, A: Mentionable<'a, Ctx>> AsRef<[u8]> for Point<'a, Ct | |||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for PointFactory<F> { | impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> FactoryBase<'a, Ctx> for PointFactory<F> { | ||||||
|     type Mtbl = Point<'a, Ctx, F::Mtbl>; |     type Mtbl = Point<'a, Ctx, F::Mtbl>; | ||||||
| 
 | 
 | ||||||
|     type ParseError = PointParseError; |     type ParseError = PointParseError; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
|  | impl<'a, Ctx: Context<'a>, F: Factory<'a, Ctx>> Factory<'a, Ctx> for PointFactory<F> { | ||||||
|     fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { |     fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { | ||||||
|         let (point, _) = inctx.icnext_point(self.inner(), |slice| PointParseError::from(slice))?; |         let (point, _) = inctx.icnext_point(self.inner(), |slice| PointParseError::from(slice))?; | ||||||
|         Ok(point) |         Ok(point) | ||||||
|  | |||||||
| @ -87,11 +87,13 @@ impl<'a> Display for TypelessError<'a> { | |||||||
| 
 | 
 | ||||||
| impl<'a> Error for TypelessError<'a> {} | impl<'a> Error for TypelessError<'a> {} | ||||||
| 
 | 
 | ||||||
| impl<'a, Ctx: Context<'a>> Factory<'a, Ctx> for TypelessFactory<'a, Ctx> { | impl<'a, Ctx: Context<'a>> FactoryBase<'a, Ctx> for TypelessFactory<'a, Ctx> { | ||||||
|     type Mtbl = TypelessMentionable<'a, Ctx>; |     type Mtbl = TypelessMentionable<'a, Ctx>; | ||||||
| 
 | 
 | ||||||
|     type ParseError = TypelessError<'a>; |     type ParseError = TypelessError<'a>; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
|  | impl<'a, Ctx: Context<'a>> Factory<'a, Ctx> for TypelessFactory<'a, Ctx> { | ||||||
|     fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { |     fn deserialize(&self, inctx: impl InCtx<'a, Ctx>) -> ParseResult<'a, Ctx, Self> { | ||||||
|         self.t_deserialize.de(inctx.demote()).map_err(TypelessError) |         self.t_deserialize.de(inctx.demote()).map_err(TypelessError) | ||||||
|     } |     } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user