Diffstat (limited to 'src/protocols.rs')
| -rw-r--r-- | src/protocols.rs | 685 |
1 files changed, 0 insertions, 685 deletions
diff --git a/src/protocols.rs b/src/protocols.rs index 3f1d597..e69de29 100644 --- a/src/protocols.rs +++ b/src/protocols.rs @@ -1,685 +0,0 @@ -pub enum ControlFlow { - Done, - Error, -} - -pub mod hint { - use crate::protocol::{Implementer, Protocol}; - - pub enum ControlFlow { - HintGiven, - NoHint, - Error, - } - - pub trait Object<'ctx> { - fn request_hint(&mut self, hints: &mut dyn Implementer<'ctx>) -> ControlFlow; - } - - pub enum RequestHint {} - - impl Protocol for RequestHint { - type Object<'a, 'ctx: 'a> = &'a mut dyn Object<'ctx>; - } - - pub trait HintObject<'ctx> { - fn hint(&mut self, visitor: &mut dyn Implementer<'ctx>) -> ControlFlow; - } -} - -pub mod recoverable { - use crate::protocol::{Implementer, Protocol}; - - use super::{hint::HintObject, ControlFlow}; - - pub trait Accessor<'ctx> { - fn new_walk(&mut self, visitor: &mut dyn Implementer<'ctx>) -> ControlFlow; - } - - pub trait Object<'ctx> { - fn visit(&mut self, accessor: &mut dyn Accessor<'ctx>) -> ControlFlow; - } - - pub enum Recoverable {} - - impl Protocol for Recoverable { - type Object<'a, 'ctx: 'a> = &'a mut dyn Object<'ctx>; - } - - pub enum Hint {} - - impl Protocol for Hint { - type Object<'a, 'ctx: 'a> = &'a mut dyn HintObject<'ctx>; - } -} - -pub mod sequence { - use crate::protocol::{Implementer, Protocol}; - - #[derive(PartialEq)] - pub enum ControlFlow { - Done, - Continue, - Error, - } - - pub trait Accessor<'ctx> { - fn next(&mut self, visitor: &mut dyn Implementer<'ctx>) -> ControlFlow; - } - - pub trait Object<'ctx> { - fn visit(&mut self, accessor: &mut dyn Accessor<'ctx>) -> super::ControlFlow; - } - - pub enum Sequence {} - - impl Protocol for Sequence { - type Object<'a, 'ctx: 'a> = &'a mut dyn Object<'ctx>; - } - - pub trait HintObject<'ctx> { - fn hint(&mut self, visitor: &mut dyn Implementer<'ctx>) -> super::ControlFlow; - - fn len(&mut self) -> (usize, Option<usize>) { - (0, None) - } - } - - pub enum Hint {} - - impl Protocol for Hint { - type Object<'a, 'ctx: 'a> = &'a mut dyn HintObject<'ctx>; - } -} - -pub mod bool { - use crate::protocol::Protocol; - - use super::{hint::HintObject, ControlFlow}; - - pub trait Object<'ctx> { - fn visit(&mut self, value: bool) -> ControlFlow; - } - - pub enum Bool {} - - impl Protocol for Bool { - type Object<'a, 'ctx: 'a> = &'a mut dyn Object<'ctx>; - } - - pub enum Hint {} - - impl Protocol for Hint { - type Object<'a, 'ctx: 'a> = &'a mut dyn HintObject<'ctx>; - } -} - -/* -pub mod map { - use crate::{protocol::Protocol, ControlFlow, Visitor}; - - pub struct Hint { - pub min_len: Option<usize>, - pub max_len: Option<usize>, - } - - pub struct Known { - pub len: Option<usize>, - } - - pub trait Accessor<'ctx> { - fn next_key(&mut self, visitor: &mut dyn Visitor<'ctx>) -> ControlFlow; - fn value(&mut self, visitor: &mut dyn Visitor<'ctx>) -> ControlFlow; - } - - pub enum Map {} - - impl Protocol for Map { - type Hint<'walking, 'ctx: 'walking> = Hint; - - type Known<'walking, 'ctx: 'walking> = Known; - - type Accessor<'walking, 'ctx: 'walking> = &'walking mut dyn Accessor<'ctx>; - } -} - -pub mod reference { - use core::{any::Any, marker::PhantomData}; - - use crate::protocol::Protocol; - - pub enum Kind { - Walking, - Context, - Static, - } - - pub struct Hint { - pub kind: Option<Kind>, - - pub min_len: Option<usize>, - pub max_len: Option<usize>, - } - - pub struct Known { - pub kind: Option<Kind>, - - /// For dynamically sized types. - pub len: Option<usize>, - } - - pub enum Ref<'walking, 'ctx, T: ?Sized + Any> { - Walking(&'walking T), - Context(&'ctx T), - Static(&'static T), - } - - pub enum Mut<'walking, 'ctx, T: ?Sized + Any> { - Walking(&'walking mut T), - Context(&'ctx mut T), - Static(&'static mut T), - } - - pub struct Reference<T: ?Sized + Any>(PhantomData<fn() -> T>); - - pub struct ReferenceMut<T: ?Sized + Any>(PhantomData<fn() -> T>); - - impl<T: ?Sized + Any> Protocol for Reference<T> { - type Hint<'walking, 'ctx: 'walking> = Hint; - - type Known<'walking, 'ctx: 'walking> = Known; - - type Accessor<'walking, 'ctx: 'walking> = Ref<'walking, 'ctx, T>; - } - - impl<T: ?Sized + Any> Protocol for ReferenceMut<T> { - type Hint<'walking, 'ctx: 'walking> = Hint; - - type Known<'walking, 'ctx: 'walking> = Known; - - type Accessor<'walking, 'ctx: 'walking> = Mut<'walking, 'ctx, T>; - } -} - -pub mod bool { - use crate::protocol::Protocol; - - pub enum Bool {} - - impl Protocol for Bool { - type Hint<'walking, 'ctx: 'walking> = (); - - type Known<'walking, 'ctx: 'walking> = (); - - type Accessor<'walking, 'ctx: 'walking> = bool; - } -} - -pub mod int { - use core::num::TryFromIntError; - - use crate::protocol::Protocol; - - pub enum Kind { - I8, - I16, - I32, - I64, - I128, - Isize, - U8, - U16, - U32, - U64, - U128, - Usize, - } - - pub enum Value { - I8(i8), - I16(i16), - I32(i32), - I64(i64), - I128(i128), - Isize(isize), - U8(u8), - U16(u16), - U32(u32), - U64(u64), - U128(u128), - Usize(usize), - } - - pub enum Int {} - - impl Protocol for Int { - type Hint<'walking, 'ctx: 'walking> = Option<Kind>; - - type Known<'walking, 'ctx: 'walking> = Option<Kind>; - - type Accessor<'walking, 'ctx: 'walking> = Value; - } - - impl From<i8> for Value { - fn from(value: i8) -> Self { - Self::I8(value) - } - } - - impl From<i16> for Value { - fn from(value: i16) -> Self { - Self::I16(value) - } - } - - impl From<i32> for Value { - fn from(value: i32) -> Self { - Self::I32(value) - } - } - - impl From<i64> for Value { - fn from(value: i64) -> Self { - Self::I64(value) - } - } - - impl From<i128> for Value { - fn from(value: i128) -> Self { - Self::I128(value) - } - } - - impl From<isize> for Value { - fn from(value: isize) -> Self { - Self::Isize(value) - } - } - - impl From<u8> for Value { - fn from(value: u8) -> Self { - Self::U8(value) - } - } - - impl From<u16> for Value { - fn from(value: u16) -> Self { - Self::U16(value) - } - } - - impl From<u32> for Value { - fn from(value: u32) -> Self { - Self::U32(value) - } - } - - impl From<u64> for Value { - fn from(value: u64) -> Self { - Self::U64(value) - } - } - - impl From<u128> for Value { - fn from(value: u128) -> Self { - Self::U128(value) - } - } - - impl From<usize> for Value { - fn from(value: usize) -> Self { - Self::Usize(value) - } - } - - impl TryFrom<Value> for i8 { - type Error = TryFromIntError; - - fn try_from(value: Value) -> Result<Self, Self::Error> { - match value { - Value::I8(value) => Ok(value), - Value::I16(value) => value.try_into(), - Value::I32(value) => value.try_into(), - Value::I64(value) => value.try_into(), - Value::I128(value) => value.try_into(), - Value::Isize(value) => value.try_into(), - Value::U8(value) => value.try_into(), - Value::U16(value) => value.try_into(), - Value::U32(value) => value.try_into(), - Value::U64(value) => value.try_into(), - Value::U128(value) => value.try_into(), - Value::Usize(value) => value.try_into(), - } - } - } - - impl TryFrom<Value> for i16 { - type Error = TryFromIntError; - - fn try_from(value: Value) -> Result<Self, Self::Error> { - match value { - Value::I8(value) => Ok(value.into()), - Value::I16(value) => Ok(value), - Value::I32(value) => value.try_into(), - Value::I64(value) => value.try_into(), - Value::I128(value) => value.try_into(), - Value::Isize(value) => value.try_into(), - Value::U8(value) => Ok(value.into()), - Value::U16(value) => value.try_into(), - Value::U32(value) => value.try_into(), - Value::U64(value) => value.try_into(), - Value::U128(value) => value.try_into(), - Value::Usize(value) => value.try_into(), - } - } - } - - impl TryFrom<Value> for i32 { - type Error = TryFromIntError; - - fn try_from(value: Value) -> Result<Self, Self::Error> { - match value { - Value::I8(value) => Ok(value.into()), - Value::I16(value) => Ok(value.into()), - Value::I32(value) => Ok(value), - Value::I64(value) => value.try_into(), - Value::I128(value) => value.try_into(), - Value::Isize(value) => value.try_into(), - Value::U8(value) => Ok(value.into()), - Value::U16(value) => Ok(value.into()), - Value::U32(value) => value.try_into(), - Value::U64(value) => value.try_into(), - Value::U128(value) => value.try_into(), - Value::Usize(value) => value.try_into(), - } - } - } - - impl TryFrom<Value> for i64 { - type Error = TryFromIntError; - - fn try_from(value: Value) -> Result<Self, Self::Error> { - match value { - Value::I8(value) => Ok(value.into()), - Value::I16(value) => Ok(value.into()), - Value::I32(value) => Ok(value.into()), - Value::I64(value) => Ok(value), - Value::I128(value) => value.try_into(), - Value::Isize(value) => value.try_into(), - Value::U8(value) => Ok(value.into()), - Value::U16(value) => Ok(value.into()), - Value::U32(value) => Ok(value.into()), - Value::U64(value) => value.try_into(), - Value::U128(value) => value.try_into(), - Value::Usize(value) => value.try_into(), - } - } - } - - impl TryFrom<Value> for i128 { - type Error = TryFromIntError; - - fn try_from(value: Value) -> Result<Self, Self::Error> { - match value { - Value::I8(value) => Ok(value.into()), - Value::I16(value) => Ok(value.into()), - Value::I32(value) => Ok(value.into()), - Value::I64(value) => Ok(value.into()), - Value::I128(value) => Ok(value), - Value::Isize(value) => value.try_into(), - Value::U8(value) => Ok(value.into()), - Value::U16(value) => Ok(value.into()), - Value::U32(value) => Ok(value.into()), - Value::U64(value) => Ok(value.into()), - Value::U128(value) => value.try_into(), - Value::Usize(value) => value.try_into(), - } - } - } - - impl TryFrom<Value> for isize { - type Error = TryFromIntError; - - fn try_from(value: Value) -> Result<Self, Self::Error> { - match value { - Value::I8(value) => Ok(value.into()), - Value::I16(value) => Ok(value.into()), - Value::I32(value) => value.try_into(), - Value::I64(value) => value.try_into(), - Value::I128(value) => value.try_into(), - Value::Isize(value) => Ok(value), - Value::U8(value) => Ok(value.into()), - Value::U16(value) => value.try_into(), - Value::U32(value) => value.try_into(), - Value::U64(value) => value.try_into(), - Value::U128(value) => value.try_into(), - Value::Usize(value) => value.try_into(), - } - } - } - - impl TryFrom<Value> for u8 { - type Error = TryFromIntError; - - fn try_from(value: Value) -> Result<Self, Self::Error> { - match value { - Value::U8(value) => Ok(value), - Value::U16(value) => value.try_into(), - Value::U32(value) => value.try_into(), - Value::U64(value) => value.try_into(), - Value::U128(value) => value.try_into(), - Value::Usize(value) => value.try_into(), - Value::I8(value) => value.try_into(), - Value::I16(value) => value.try_into(), - Value::I32(value) => value.try_into(), - Value::I64(value) => value.try_into(), - Value::I128(value) => value.try_into(), - Value::Isize(value) => value.try_into(), - } - } - } - - impl TryFrom<Value> for u16 { - type Error = TryFromIntError; - - fn try_from(value: Value) -> Result<Self, Self::Error> { - match value { - Value::U8(value) => Ok(value.into()), - Value::U16(value) => Ok(value), - Value::U32(value) => value.try_into(), - Value::U64(value) => value.try_into(), - Value::U128(value) => value.try_into(), - Value::Usize(value) => value.try_into(), - Value::I8(value) => value.try_into(), - Value::I16(value) => value.try_into(), - Value::I32(value) => value.try_into(), - Value::I64(value) => value.try_into(), - Value::I128(value) => value.try_into(), - Value::Isize(value) => value.try_into(), - } - } - } - - impl TryFrom<Value> for u32 { - type Error = TryFromIntError; - - fn try_from(value: Value) -> Result<Self, Self::Error> { - match value { - Value::U8(value) => Ok(value.into()), - Value::U16(value) => Ok(value.into()), - Value::U32(value) => Ok(value), - Value::U64(value) => value.try_into(), - Value::U128(value) => value.try_into(), - Value::Usize(value) => value.try_into(), - Value::I8(value) => value.try_into(), - Value::I16(value) => value.try_into(), - Value::I32(value) => value.try_into(), - Value::I64(value) => value.try_into(), - Value::I128(value) => value.try_into(), - Value::Isize(value) => value.try_into(), - } - } - } - - impl TryFrom<Value> for u64 { - type Error = TryFromIntError; - - fn try_from(value: Value) -> Result<Self, Self::Error> { - match value { - Value::U8(value) => Ok(value.into()), - Value::U16(value) => Ok(value.into()), - Value::U32(value) => Ok(value.into()), - Value::U64(value) => Ok(value), - Value::U128(value) => value.try_into(), - Value::Usize(value) => value.try_into(), - Value::I8(value) => value.try_into(), - Value::I16(value) => value.try_into(), - Value::I32(value) => value.try_into(), - Value::I64(value) => value.try_into(), - Value::I128(value) => value.try_into(), - Value::Isize(value) => value.try_into(), - } - } - } - - impl TryFrom<Value> for u128 { - type Error = TryFromIntError; - - fn try_from(value: Value) -> Result<Self, Self::Error> { - match value { - Value::U8(value) => Ok(value.into()), - Value::U16(value) => Ok(value.into()), - Value::U32(value) => Ok(value.into()), - Value::U64(value) => Ok(value.into()), - Value::U128(value) => Ok(value), - Value::Usize(value) => value.try_into(), - Value::I8(value) => value.try_into(), - Value::I16(value) => value.try_into(), - Value::I32(value) => value.try_into(), - Value::I64(value) => value.try_into(), - Value::I128(value) => value.try_into(), - Value::Isize(value) => value.try_into(), - } - } - } - - impl TryFrom<Value> for usize { - type Error = TryFromIntError; - - fn try_from(value: Value) -> Result<Self, Self::Error> { - match value { - Value::U8(value) => Ok(value.into()), - Value::U16(value) => Ok(value.into()), - Value::U32(value) => value.try_into(), - Value::U64(value) => value.try_into(), - Value::U128(value) => value.try_into(), - Value::Usize(value) => Ok(value), - Value::I8(value) => value.try_into(), - Value::I16(value) => value.try_into(), - Value::I32(value) => value.try_into(), - Value::I64(value) => value.try_into(), - Value::I128(value) => value.try_into(), - Value::Isize(value) => value.try_into(), - } - } - } -} - -pub mod optional { - use crate::{protocol::Protocol, Walker}; - - pub enum Kind { - Some, - None, - } - - pub enum Optional {} - - impl Protocol for Optional { - type Hint<'walking, 'ctx: 'walking> = Option<Kind>; - - type Known<'walking, 'ctx: 'walking> = Option<Kind>; - - type Accessor<'walking, 'ctx: 'walking> = Option<&'walking mut dyn Walker<'ctx>>; - } -} - -pub mod unit { - use crate::protocol::Protocol; - - pub enum Unit {} - - impl Protocol for Unit { - type Hint<'walking, 'ctx: 'walking> = (); - - type Known<'walking, 'ctx: 'walking> = (); - - type Accessor<'walking, 'ctx: 'walking> = (); - } -} - -pub mod r#struct { - use core::any::TypeId; - - use crate::protocol::Protocol; - - pub struct Hint<'walking> { - pub name: Option<&'static str>, - pub type_name: Option<&'static str>, - pub id: Option<TypeId>, - pub fields: Option<&'walking [&'walking str]>, - } - - pub struct Known<'walking> { - pub name: Option<&'static str>, - pub type_name: Option<&'static str>, - pub id: Option<TypeId>, - pub fields: Option<&'walking [&'walking str]>, - } - - pub enum Struct {} - - impl Protocol for Struct { - type Hint<'walking, 'ctx: 'walking> = Hint<'walking>; - - type Known<'walking, 'ctx: 'walking> = Known<'walking>; - - type Accessor<'walking, 'ctx: 'walking> = &'walking mut dyn super::map::Accessor<'ctx>; - } -} - -pub mod r#enum { - use core::any::TypeId; - - use crate::{protocol::Protocol, ControlFlow, Visitor}; - - pub struct Hint<'walking> { - pub name: Option<&'static str>, - pub type_name: Option<&'static str>, - pub id: Option<TypeId>, - pub variants: Option<&'walking [&'walking str]>, - } - - pub struct Known<'walking> { - pub name: Option<&'static str>, - pub type_name: Option<&'static str>, - pub id: Option<TypeId>, - pub variant: Option<&'walking str>, - } - - pub trait Accessor<'ctx> { - fn variant(&mut self, visitor: &mut dyn Visitor<'ctx>) -> ControlFlow; - fn walk(&mut self, visitor: &mut dyn Visitor<'ctx>) -> ControlFlow; - } - - pub enum Enum {} - - impl Protocol for Enum { - type Hint<'walking, 'ctx: 'walking> = Hint<'walking>; - - type Known<'walking, 'ctx: 'walking> = Known<'walking>; - - type Accessor<'walking, 'ctx: 'walking> = &'walking mut dyn Accessor<'ctx>; - } -} -*/ |