Diffstat (limited to 'src/protocols.rs')
| -rw-r--r-- | src/protocols.rs | 611 |
1 files changed, 596 insertions, 15 deletions
diff --git a/src/protocols.rs b/src/protocols.rs index cd0164e..6e0ae5f 100644 --- a/src/protocols.rs +++ b/src/protocols.rs @@ -1,23 +1,120 @@ +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::Protocol, ControlFlow, Visitor}; + use crate::protocol::{Implementer, Protocol}; + + use super::{hint::HintObject, ControlFlow}; pub trait Accessor<'ctx> { - /// Each time this is called the walker resets. - fn new_walk(&mut self, visitor: &mut dyn Visitor<'ctx>) -> ControlFlow; + 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 Hint<'ctx> = (); + type Object<'a, 'ctx: 'a> = &'a mut dyn Object<'ctx>; + } - type Known<'ctx> = (); + pub enum Hint {} - type Accessor<'walking, 'ctx: 'walking> = &'walking mut dyn Accessor<'ctx>; + impl Protocol for Hint { + type Object<'a, 'ctx: 'a> = &'a mut dyn HintObject<'ctx>; } } pub mod sequence { + use crate::protocol::{Implementer, Protocol}; + + 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 { @@ -30,15 +127,16 @@ pub mod sequence { } pub trait Accessor<'ctx> { - fn next(&mut self, visitor: &mut dyn Visitor<'ctx>) -> ControlFlow; + fn next_key(&mut self, visitor: &mut dyn Visitor<'ctx>) -> ControlFlow; + fn value(&mut self, visitor: &mut dyn Visitor<'ctx>) -> ControlFlow; } - pub enum Sequence {} + pub enum Map {} - impl Protocol for Sequence { - type Hint<'ctx> = Hint; + impl Protocol for Map { + type Hint<'walking, 'ctx: 'walking> = Hint; - type Known<'ctx> = Known; + type Known<'walking, 'ctx: 'walking> = Known; type Accessor<'walking, 'ctx: 'walking> = &'walking mut dyn Accessor<'ctx>; } @@ -86,18 +184,501 @@ pub mod reference { pub struct ReferenceMut<T: ?Sized + Any>(PhantomData<fn() -> T>); impl<T: ?Sized + Any> Protocol for Reference<T> { - type Hint<'ctx> = Hint; + type Hint<'walking, 'ctx: 'walking> = Hint; - type Known<'ctx> = Known; + 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<'ctx> = Hint; + type Hint<'walking, 'ctx: 'walking> = Hint; - type Known<'ctx> = Known; + 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>; + } +} +*/ |