Diffstat (limited to 'src/impls/core/reference.rs')
| -rw-r--r-- | src/impls/core/reference.rs | 244 |
1 files changed, 0 insertions, 244 deletions
diff --git a/src/impls/core/reference.rs b/src/impls/core/reference.rs deleted file mode 100644 index 0f5038d..0000000 --- a/src/impls/core/reference.rs +++ /dev/null @@ -1,244 +0,0 @@ -use core::any::Any; - -use crate::{ - build::{Build, Builder}, - protocol::{ - lookup_hint, lookup_visit, AnyHint, AnyVisit, Hint, ProtocolId, Visit, - VisitorMissingProtocol, WalkerMissingProtocol, - }, - protocols::{recoverable, reference}, - walk::{Walk, WalkMut, WalkOnce}, - ControlFlow, Visitor, Walker, -}; - -impl<'borrow, 'ctx, T> WalkOnce<'ctx> for &'borrow T -where - T: Walk<'borrow, 'ctx>, -{ - type Error = T::Error; - - type Value = T::Value; - - fn walk_once(self, visitor: &mut dyn Visitor<'ctx>) -> Result<Self::Value, Self::Error> { - T::walk(self, visitor) - } -} - -impl<'borrow, 'a, 'ctx, T> WalkMut<'borrow, 'ctx> for &'a T -where - T: Walk<'a, 'ctx>, -{ - fn walk_mut( - &'borrow mut self, - visitor: &mut dyn Visitor<'ctx>, - ) -> Result<Self::Value, Self::Error> { - T::walk(self, visitor) - } -} - -impl<'borrow, 'a, 'ctx, T> Walk<'borrow, 'ctx> for &'a T -where - T: Walk<'a, 'ctx>, -{ - fn walk(&'borrow self, visitor: &mut dyn Visitor<'ctx>) -> Result<Self::Value, Self::Error> { - T::walk(self, visitor) - } -} - -impl<'ctx, T: ?Sized + Any> Build<'ctx> for &'ctx T { - type Builder = RefBuilder<'ctx, T>; -} - -pub struct RefWalker<'ctx, T: ?Sized> { - value: &'ctx T, - error: Option<VisitorMissingProtocol>, -} - -impl<'ctx, T: ?Sized> RefWalker<'ctx, T> { - pub fn new(value: &'ctx T) -> Self { - Self { value, error: None } - } -} - -impl<'ctx, T: ?Sized + Any> WalkOnce<'ctx> for RefWalker<'ctx, T> { - type Error = VisitorMissingProtocol; - - type Value = (); - - fn walk_once(mut self, visitor: &mut dyn Visitor<'ctx>) -> Result<Self::Value, Self::Error> { - match visitor.request_hint(&mut self, false) { - ControlFlow::Continue => { - Hint::<reference::Reference<T>>::hint( - &mut self, - visitor, - reference::Hint { - kind: None, - min_len: None, - max_len: None, - }, - ); - } - _ => {} - } - - if let Some(err) = self.error { - Err(err) - } else { - Ok(()) - } - } -} - -impl<'ctx, T: ?Sized + Any> Walker<'ctx> for RefWalker<'ctx, T> { - fn protocol(&mut self, id: ProtocolId) -> Option<crate::protocol::AnyHint<'_, 'ctx>> { - if id == ProtocolId::of::<reference::Reference<T>>() { - Some(AnyHint::new::<reference::Reference<T>>(self)) - } else if id == ProtocolId::of::<reference::Reference<T>>() { - Some(AnyHint::new::<recoverable::Recoverable>(self)) - } else { - None - } - } -} - -impl<'ctx, T: ?Sized + Any> Hint<'ctx, reference::Reference<T>> for RefWalker<'ctx, T> { - fn hint(&mut self, visitor: &mut dyn Visitor<'ctx>, _hint: reference::Hint) -> ControlFlow { - match lookup_visit::<reference::Reference<T>, _>(visitor) { - Ok(visit) => visit.visit(reference::Ref::Context(self.value)).to_done(), - Err(err) => { - self.error = Some(err); - ControlFlow::Error - } - } - } - - fn known(&mut self, _hint: &reference::Hint) -> reference::Known { - reference::Known { - kind: Some(reference::Kind::Context), - len: None, - } - } -} - -impl<'ctx, T: ?Sized + Any> Hint<'ctx, recoverable::Recoverable> for RefWalker<'ctx, T> { - fn hint(&mut self, visitor: &mut dyn Visitor<'ctx>, _hint: ()) -> ControlFlow { - match lookup_visit::<recoverable::Recoverable, _>(visitor) { - Ok(visit) => visit.visit(self).to_done(), - Err(err) => { - self.error = Some(err); - ControlFlow::Error - } - } - } - - fn known(&mut self, _hint: &()) {} -} - -impl<'ctx, T: ?Sized + Any> recoverable::Accessor<'ctx> for RefWalker<'ctx, T> { - fn new_walk(&mut self, visitor: &mut dyn Visitor<'ctx>) -> ControlFlow { - todo!() - } -} - -#[derive(thiserror::Error, Debug)] -pub enum Error { - #[error("Missing value after walk.")] - MissingValue, - - #[error("A value with a lifetime to short was given.")] - ShortLifetime, - - #[error(transparent)] - MissingProtocol(#[from] WalkerMissingProtocol), -} - -pub struct RefBuilder<'ctx, T: ?Sized> { - value: Option<Result<&'ctx T, Error>>, -} - -impl<'ctx, T: ?Sized> Default for RefBuilder<'ctx, T> { - fn default() -> Self { - Self { value: None } - } -} - -impl<'ctx, T: ?Sized + Any> Builder<'ctx> for RefBuilder<'ctx, T> { - type Error = Error; - - type Value = &'ctx T; - - fn as_visitor(&mut self) -> &mut dyn Visitor<'ctx> { - self - } - - fn build(self) -> Result<Self::Value, Self::Error> { - match self.value { - Some(Ok(value)) => Ok(value), - Some(Err(err)) => Err(err.into()), - None => Err(Error::MissingValue), - } - } -} - -impl<'ctx, T: ?Sized + Any> Visitor<'ctx> for RefBuilder<'ctx, T> { - fn request_hint( - &mut self, - hints: &mut dyn crate::Walker<'ctx>, - _need_hint: bool, - ) -> ControlFlow { - match lookup_hint::<reference::Reference<T>, _>(hints) { - Ok(hint) => hint.hint( - self, - reference::Hint { - kind: Some(reference::Kind::Context), - min_len: None, - max_len: None, - }, - ), - Err(err) => { - self.value = Some(Err(err.into())); - ControlFlow::Error - } - } - } - - fn protocol(&mut self, id: crate::protocol::ProtocolId) -> Option<AnyVisit<'_, 'ctx>> { - if id == ProtocolId::of::<reference::Reference<T>>() { - Some(AnyVisit::new::<reference::Reference<T>>(self)) - } else if id == ProtocolId::of::<reference::ReferenceMut<T>>() { - Some(AnyVisit::new::<reference::ReferenceMut<T>>(self)) - } else { - None - } - } -} - -impl<'ctx, T: ?Sized + Any> Visit<'ctx, reference::Reference<T>> for RefBuilder<'ctx, T> { - fn visit(&mut self, accessor: reference::Ref<'_, 'ctx, T>) -> ControlFlow { - match accessor { - reference::Ref::Walking(_) => { - self.value = Some(Err(Error::ShortLifetime)); - ControlFlow::Error - } - reference::Ref::Context(value) | reference::Ref::Static(value) => { - self.value = Some(Ok(value)); - ControlFlow::Done - } - } - } -} - -impl<'ctx, T: ?Sized + Any> Visit<'ctx, reference::ReferenceMut<T>> for RefBuilder<'ctx, T> { - fn visit(&mut self, accessor: reference::Mut<'_, 'ctx, T>) -> ControlFlow { - match accessor { - reference::Mut::Walking(_) => { - self.value = Some(Err(Error::ShortLifetime)); - ControlFlow::Error - } - reference::Mut::Context(value) | reference::Mut::Static(value) => { - self.value = Some(Ok(value)); - ControlFlow::Done - } - } - } -} |