merge ctypeless
+typeless
This commit is contained in:
parent
28065991f7
commit
5d1349cd80
@ -77,7 +77,7 @@ pub type ParseResult<'a, Ctx, F> =
|
|||||||
Result<<F as Factory<'a, Ctx>>::Mtbl, <F as Factory<'a, Ctx>>::ParseError>;
|
Result<<F as Factory<'a, Ctx>>::Mtbl, <F as Factory<'a, Ctx>>::ParseError>;
|
||||||
|
|
||||||
/// Trait representing deserialisation rules for [Mentionable]s.
|
/// 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 {
|
pub trait Factory<'a, Ctx: 'a + Context>: '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>;
|
||||||
|
@ -3,14 +3,13 @@
|
|||||||
pub mod atomic;
|
pub mod atomic;
|
||||||
pub mod cast;
|
pub mod cast;
|
||||||
pub mod collections;
|
pub mod collections;
|
||||||
pub mod ctypeless;
|
|
||||||
pub mod fallible;
|
pub mod fallible;
|
||||||
pub mod inlining;
|
pub mod inlining;
|
||||||
mod local_origin;
|
mod local_origin;
|
||||||
pub mod nullable;
|
pub mod nullable;
|
||||||
pub mod point;
|
pub mod point;
|
||||||
pub mod tracing;
|
pub mod tracing;
|
||||||
mod typeless;
|
pub mod typeless;
|
||||||
mod wrapped_origin;
|
mod wrapped_origin;
|
||||||
|
|
||||||
use std::{error::Error, fmt::Display, rc::Rc};
|
use std::{error::Error, fmt::Display, rc::Rc};
|
||||||
|
@ -7,7 +7,7 @@ use std::convert::identity;
|
|||||||
|
|
||||||
use crate::core::*;
|
use crate::core::*;
|
||||||
|
|
||||||
use super::{ctypeless::*, typeless::*, wrapped_origin::*, *};
|
use super::{typeless::*, wrapped_origin::*, *};
|
||||||
|
|
||||||
struct CastResolver<'a, Ctx: 'a + Context> {
|
struct CastResolver<'a, Ctx: 'a + Context> {
|
||||||
points: Vec<Point<'a, Ctx, TypelessMentionable<'a, Ctx>>>,
|
points: Vec<Point<'a, Ctx, TypelessMentionable<'a, Ctx>>>,
|
||||||
|
@ -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<TypelessSerialize<'a>>,
|
|
||||||
t_factory: TypelessFactory<'a, Ctx>,
|
|
||||||
t_topology: Hash,
|
|
||||||
t_points: Vec<Point<'a, Ctx, TypelessMentionable<'a, Ctx>>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
type TypelessParsed<'a, Ctx> = Result<TypelessMentionable<'a, Ctx>, Box<dyn 'a + Error>>;
|
|
||||||
|
|
||||||
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<dyn Resolver<'a, Ctx>>,
|
|
||||||
addresses: &mut Addresses,
|
|
||||||
) -> TypelessParsed<'a, Ctx>;
|
|
||||||
}
|
|
||||||
|
|
||||||
type TdeBox<'a, Ctx> = Box<dyn Tde<'a, Ctx>>;
|
|
||||||
|
|
||||||
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<dyn Tut<'a, Ctx>>;
|
|
||||||
|
|
||||||
/// 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<dyn 'a + Error>);
|
|
||||||
|
|
||||||
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<dyn Resolver<'a, Ctx>>,
|
|
||||||
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<A: Mentionable<'a, Ctx>>(mentionable: Rc<A>) -> 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<dyn Resolver<'a, Ctx>>,
|
|
||||||
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<dyn 'a + Error> = 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<F: Factory<'a, Ctx>>(factory: F) -> Self {
|
|
||||||
TypelessFactory {
|
|
||||||
t_deserialize: Box::new(factory.clone()),
|
|
||||||
t_unexpected_tail: Box::new(factory),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> TypelessError<'a> {
|
|
||||||
pub fn from_typed<E: 'a + Error>(error: E) -> Self {
|
|
||||||
TypelessError(Box::new(error))
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,4 +1,4 @@
|
|||||||
use crate::std::{cast::*, ctypeless::*};
|
use crate::std::{cast::*, typeless::*};
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
@ -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<TypelessSerialize<'a>>,
|
||||||
|
t_factory: TypelessFactory<'a, Ctx>,
|
||||||
|
t_topology: Hash,
|
||||||
|
t_points: Vec<Point<'a, Ctx, TypelessMentionable<'a, Ctx>>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
type TypelessParsed<'a, Ctx> = Result<TypelessMentionable<'a, Ctx>, Box<dyn 'a + Error>>;
|
||||||
|
|
||||||
|
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<dyn Resolver<'a, Ctx>>,
|
||||||
|
addresses: &mut Addresses,
|
||||||
|
) -> TypelessParsed<'a, Ctx>;
|
||||||
|
}
|
||||||
|
|
||||||
|
type TdeBox<'a, Ctx> = Box<dyn Tde<'a, Ctx>>;
|
||||||
|
|
||||||
|
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<dyn Tut<'a, Ctx>>;
|
||||||
|
|
||||||
|
/// 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<dyn 'a + Error>);
|
||||||
|
|
||||||
|
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<dyn Resolver<'a, Ctx>>,
|
||||||
|
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<A: Mentionable<'a, Ctx>>(mentionable: Rc<A>) -> 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<dyn Resolver<'a, Ctx>>,
|
||||||
|
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<dyn 'a + Error> = 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<F: Factory<'a, Ctx>>(factory: F) -> Self {
|
||||||
|
TypelessFactory {
|
||||||
|
t_deserialize: Box::new(factory.clone()),
|
||||||
|
t_unexpected_tail: Box::new(factory),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> TypelessError<'a> {
|
||||||
|
pub fn from_typed<E: 'a + Error>(error: E) -> Self {
|
||||||
|
TypelessError(Box::new(error))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> Point<'a, Ctx, A> {
|
impl<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> Point<'a, Ctx, A> {
|
||||||
/// Typeless version of the point.
|
/// Typeless version of the point.
|
||||||
|
@ -8,7 +8,7 @@ use sha2::{Digest, Sha256};
|
|||||||
use crate::core::*;
|
use crate::core::*;
|
||||||
use crate::func::*;
|
use crate::func::*;
|
||||||
use crate::std::cast::*;
|
use crate::std::cast::*;
|
||||||
use crate::std::ctypeless::*;
|
use crate::std::typeless::*;
|
||||||
|
|
||||||
pub struct NoDiagnostic;
|
pub struct NoDiagnostic;
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ use std::cmp::max;
|
|||||||
|
|
||||||
use crate::core::*;
|
use crate::core::*;
|
||||||
use crate::func::*;
|
use crate::func::*;
|
||||||
use crate::std::ctypeless::*;
|
use crate::std::typeless::*;
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user