diff --git a/src/core.rs b/src/core.rs index 3c78d22..dc737f0 100644 --- a/src/core.rs +++ b/src/core.rs @@ -77,7 +77,7 @@ pub type ParseResult<'a, Ctx, F> = Result<>::Mtbl, >::ParseError>; /// Trait representing deserialisation rules for [Mentionable]s. -/// Crucial for [`crate::std::ctypeless`]. +/// Crucial for [`crate::std::typeless`]. pub trait Factory<'a, Ctx: 'a + Context>: 'a + Send + Sync + Clone { /// Type of the associated objects. type Mtbl: Mentionable<'a, Ctx, Fctr = Self>; diff --git a/src/std.rs b/src/std.rs index 5e4e1b1..a5e5633 100644 --- a/src/std.rs +++ b/src/std.rs @@ -3,14 +3,13 @@ pub mod atomic; pub mod cast; pub mod collections; -pub mod ctypeless; pub mod fallible; pub mod inlining; mod local_origin; pub mod nullable; pub mod point; pub mod tracing; -mod typeless; +pub mod typeless; mod wrapped_origin; use std::{error::Error, fmt::Display, rc::Rc}; diff --git a/src/std/cast.rs b/src/std/cast.rs index af29544..332215f 100644 --- a/src/std/cast.rs +++ b/src/std/cast.rs @@ -7,7 +7,7 @@ use std::convert::identity; use crate::core::*; -use super::{ctypeless::*, typeless::*, wrapped_origin::*, *}; +use super::{typeless::*, wrapped_origin::*, *}; struct CastResolver<'a, Ctx: 'a + Context> { points: Vec>>, diff --git a/src/std/ctypeless.rs b/src/std/ctypeless.rs deleted file mode 100644 index 6900fb2..0000000 --- a/src/std/ctypeless.rs +++ /dev/null @@ -1,169 +0,0 @@ -//! Previously part of [`crate::core`]. - -use super::{typeless::*, *}; - -type TypelessSerialize<'a> = dyn 'a + Fn(&mut dyn Serializer); - -/// See [`Point::typeless`]. -pub struct TypelessMentionable<'a, Ctx: 'a + Context> { - t_serialize: Box>, - t_factory: TypelessFactory<'a, Ctx>, - t_topology: Hash, - t_points: Vec>>, -} - -type TypelessParsed<'a, Ctx> = Result, Box>; - -trait Tde<'a, Ctx: 'a + Context>: 'a + Send + Sync { - fn clone_box(&self) -> TdeBox<'a, Ctx>; - - fn de( - &self, - deserializer: &mut dyn Deserializer, - resolver: Rc>, - addresses: &mut Addresses, - ) -> TypelessParsed<'a, Ctx>; -} - -type TdeBox<'a, Ctx> = Box>; - -trait Tut<'a, Ctx: 'a + Context>: 'a + Send + Sync { - fn clone_box(&self) -> TutBox<'a, Ctx>; - - fn ut(&self, tail: &[u8]) -> TypelessError<'a>; -} - -type TutBox<'a, Ctx> = Box>; - -/// See [`Point::typeless`]/[`TypelessMentionable`]. -pub struct TypelessFactory<'a, Ctx: 'a + Context> { - t_deserialize: TdeBox<'a, Ctx>, - t_unexpected_tail: TutBox<'a, Ctx>, -} - -impl<'a, Ctx: 'a + Context> Serializable for TypelessMentionable<'a, Ctx> { - fn serialize(&self, serializer: &mut dyn Serializer) { - (self.t_serialize)(serializer); - } -} - -impl<'a, Ctx: 'a + Context> Mentionable<'a, Ctx> for TypelessMentionable<'a, Ctx> { - type Fctr = TypelessFactory<'a, Ctx>; - - fn factory(&self) -> Self::Fctr { - self.t_factory.clone() - } - - fn topology(&self) -> Hash { - self.t_topology - } - - fn points_typed(&self, points: &mut impl TakesPoints<'a, Ctx>) { - for point in self.t_points.iter() { - points.take(point) - } - } -} - -impl<'a, Ctx: 'a + Context> Clone for TypelessFactory<'a, Ctx> { - fn clone(&self) -> Self { - Self { - t_deserialize: self.t_deserialize.clone_box(), - t_unexpected_tail: self.t_unexpected_tail.clone_box(), - } - } -} - -/// See [`Point::typeless`]/[`TypelessFactory`]. -#[derive(Debug)] -pub struct TypelessError<'a>(Box); - -impl<'a> Display for TypelessError<'a> { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.write_fmt(format_args!("typeless error: {}", self.0)) - } -} - -impl<'a> Error for TypelessError<'a> {} - -impl<'a, Ctx: 'a + Context> Factory<'a, Ctx> for TypelessFactory<'a, Ctx> { - type Mtbl = TypelessMentionable<'a, Ctx>; - - type ParseError = TypelessError<'a>; - - fn deserialize( - &self, - deserializer: &mut dyn Deserializer, - resolver: Rc>, - addresses: &mut Addresses, - ) -> ParseResult<'a, Ctx, Self> { - match self.t_deserialize.de(deserializer, resolver, addresses) { - Ok(mentionable) => Ok(mentionable), - Err(error) => Err(TypelessError(error)), - } - } - - fn unexpected_tail(&self, tail: &[u8]) -> Self::ParseError { - self.t_unexpected_tail.ut(tail) - } -} - -impl<'a, Ctx: 'a + Context> TypelessMentionable<'a, Ctx> { - pub fn from_typed>(mentionable: Rc) -> Self { - let factory = TypelessFactory::from_typed(mentionable.factory()); - let topology = mentionable.topology(); - let points = mentionable.points_vec(); - TypelessMentionable { - t_serialize: Box::new(move |serializer| mentionable.serialize(serializer)), - t_factory: factory, - t_topology: topology, - t_points: points, - } - } -} - -impl<'a, Ctx: 'a + Context, F: Factory<'a, Ctx>> Tde<'a, Ctx> for F { - fn clone_box(&self) -> TdeBox<'a, Ctx> { - Box::new(self.clone()) - } - - fn de( - &self, - deserializer: &mut dyn Deserializer, - resolver: Rc>, - addresses: &mut Addresses, - ) -> TypelessParsed<'a, Ctx> { - match self.deserialize(deserializer, resolver, addresses) { - Ok(mentionable) => Ok(TypelessMentionable::from_typed(Rc::new(mentionable))), - Err(error) => { - let boxed: Box = Box::new(error); - Err(boxed) - } - } - } -} - -impl<'a, Ctx: 'a + Context, F: Factory<'a, Ctx>> Tut<'a, Ctx> for F { - fn clone_box(&self) -> TutBox<'a, Ctx> { - Box::new(self.clone()) - } - - fn ut(&self, tail: &[u8]) -> TypelessError<'a> { - TypelessError::from_typed(self.unexpected_tail(tail)) - } -} - -impl<'a, Ctx: 'a + Context> TypelessFactory<'a, Ctx> { - pub fn from_typed>(factory: F) -> Self { - TypelessFactory { - t_deserialize: Box::new(factory.clone()), - t_unexpected_tail: Box::new(factory), - } - } -} - -impl<'a> TypelessError<'a> { - pub fn from_typed(error: E) -> Self { - TypelessError(Box::new(error)) - } -} diff --git a/src/std/tracing/traceable.rs b/src/std/tracing/traceable.rs index 759c02e..196e910 100644 --- a/src/std/tracing/traceable.rs +++ b/src/std/tracing/traceable.rs @@ -1,4 +1,4 @@ -use crate::std::{cast::*, ctypeless::*}; +use crate::std::{cast::*, typeless::*}; use super::*; diff --git a/src/std/typeless.rs b/src/std/typeless.rs index 6759cfb..9daf146 100644 --- a/src/std/typeless.rs +++ b/src/std/typeless.rs @@ -1,6 +1,172 @@ -use crate::core::*; +//! Previously part of [`crate::core`]. -use super::{ctypeless::*, wrapped_origin::*}; +use super::{wrapped_origin::*, *}; + +type TypelessSerialize<'a> = dyn 'a + Fn(&mut dyn Serializer); + +/// See [`Point::typeless`]. +pub struct TypelessMentionable<'a, Ctx: 'a + Context> { + t_serialize: Box>, + t_factory: TypelessFactory<'a, Ctx>, + t_topology: Hash, + t_points: Vec>>, +} + +type TypelessParsed<'a, Ctx> = Result, Box>; + +trait Tde<'a, Ctx: 'a + Context>: 'a + Send + Sync { + fn clone_box(&self) -> TdeBox<'a, Ctx>; + + fn de( + &self, + deserializer: &mut dyn Deserializer, + resolver: Rc>, + addresses: &mut Addresses, + ) -> TypelessParsed<'a, Ctx>; +} + +type TdeBox<'a, Ctx> = Box>; + +trait Tut<'a, Ctx: 'a + Context>: 'a + Send + Sync { + fn clone_box(&self) -> TutBox<'a, Ctx>; + + fn ut(&self, tail: &[u8]) -> TypelessError<'a>; +} + +type TutBox<'a, Ctx> = Box>; + +/// See [`Point::typeless`]/[`TypelessMentionable`]. +pub struct TypelessFactory<'a, Ctx: 'a + Context> { + t_deserialize: TdeBox<'a, Ctx>, + t_unexpected_tail: TutBox<'a, Ctx>, +} + +impl<'a, Ctx: 'a + Context> Serializable for TypelessMentionable<'a, Ctx> { + fn serialize(&self, serializer: &mut dyn Serializer) { + (self.t_serialize)(serializer); + } +} + +impl<'a, Ctx: 'a + Context> Mentionable<'a, Ctx> for TypelessMentionable<'a, Ctx> { + type Fctr = TypelessFactory<'a, Ctx>; + + fn factory(&self) -> Self::Fctr { + self.t_factory.clone() + } + + fn topology(&self) -> Hash { + self.t_topology + } + + fn points_typed(&self, points: &mut impl TakesPoints<'a, Ctx>) { + for point in self.t_points.iter() { + points.take(point) + } + } +} + +impl<'a, Ctx: 'a + Context> Clone for TypelessFactory<'a, Ctx> { + fn clone(&self) -> Self { + Self { + t_deserialize: self.t_deserialize.clone_box(), + t_unexpected_tail: self.t_unexpected_tail.clone_box(), + } + } +} + +/// See [`Point::typeless`]/[`TypelessFactory`]. +#[derive(Debug)] +pub struct TypelessError<'a>(Box); + +impl<'a> Display for TypelessError<'a> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_fmt(format_args!("typeless error: {}", self.0)) + } +} + +impl<'a> Error for TypelessError<'a> {} + +impl<'a, Ctx: 'a + Context> Factory<'a, Ctx> for TypelessFactory<'a, Ctx> { + type Mtbl = TypelessMentionable<'a, Ctx>; + + type ParseError = TypelessError<'a>; + + fn deserialize( + &self, + deserializer: &mut dyn Deserializer, + resolver: Rc>, + addresses: &mut Addresses, + ) -> ParseResult<'a, Ctx, Self> { + match self.t_deserialize.de(deserializer, resolver, addresses) { + Ok(mentionable) => Ok(mentionable), + Err(error) => Err(TypelessError(error)), + } + } + + fn unexpected_tail(&self, tail: &[u8]) -> Self::ParseError { + self.t_unexpected_tail.ut(tail) + } +} + +impl<'a, Ctx: 'a + Context> TypelessMentionable<'a, Ctx> { + pub fn from_typed>(mentionable: Rc) -> Self { + let factory = TypelessFactory::from_typed(mentionable.factory()); + let topology = mentionable.topology(); + let points = mentionable.points_vec(); + TypelessMentionable { + t_serialize: Box::new(move |serializer| mentionable.serialize(serializer)), + t_factory: factory, + t_topology: topology, + t_points: points, + } + } +} + +impl<'a, Ctx: 'a + Context, F: Factory<'a, Ctx>> Tde<'a, Ctx> for F { + fn clone_box(&self) -> TdeBox<'a, Ctx> { + Box::new(self.clone()) + } + + fn de( + &self, + deserializer: &mut dyn Deserializer, + resolver: Rc>, + addresses: &mut Addresses, + ) -> TypelessParsed<'a, Ctx> { + match self.deserialize(deserializer, resolver, addresses) { + Ok(mentionable) => Ok(TypelessMentionable::from_typed(Rc::new(mentionable))), + Err(error) => { + let boxed: Box = Box::new(error); + Err(boxed) + } + } + } +} + +impl<'a, Ctx: 'a + Context, F: Factory<'a, Ctx>> Tut<'a, Ctx> for F { + fn clone_box(&self) -> TutBox<'a, Ctx> { + Box::new(self.clone()) + } + + fn ut(&self, tail: &[u8]) -> TypelessError<'a> { + TypelessError::from_typed(self.unexpected_tail(tail)) + } +} + +impl<'a, Ctx: 'a + Context> TypelessFactory<'a, Ctx> { + pub fn from_typed>(factory: F) -> Self { + TypelessFactory { + t_deserialize: Box::new(factory.clone()), + t_unexpected_tail: Box::new(factory), + } + } +} + +impl<'a> TypelessError<'a> { + pub fn from_typed(error: E) -> Self { + TypelessError(Box::new(error)) + } +} impl<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> Point<'a, Ctx, A> { /// Typeless version of the point. diff --git a/src/testing.rs b/src/testing.rs index b9178a0..9fbf72f 100644 --- a/src/testing.rs +++ b/src/testing.rs @@ -8,7 +8,7 @@ use sha2::{Digest, Sha256}; use crate::core::*; use crate::func::*; use crate::std::cast::*; -use crate::std::ctypeless::*; +use crate::std::typeless::*; pub struct NoDiagnostic; diff --git a/src/testing/counted.rs b/src/testing/counted.rs index 64ea2c6..da98c44 100644 --- a/src/testing/counted.rs +++ b/src/testing/counted.rs @@ -2,7 +2,7 @@ use std::cmp::max; use crate::core::*; use crate::func::*; -use crate::std::ctypeless::*; +use crate::std::typeless::*; use super::*;