Diffstat (limited to 'src/impls/core/reference_mut.rs')
| -rw-r--r-- | src/impls/core/reference_mut.rs | 162 |
1 files changed, 0 insertions, 162 deletions
diff --git a/src/impls/core/reference_mut.rs b/src/impls/core/reference_mut.rs deleted file mode 100644 index 98427fe..0000000 --- a/src/impls/core/reference_mut.rs +++ /dev/null @@ -1,162 +0,0 @@ -use core::any::Any; - -use crate::{ - build::{Build, Builder}, - protocol::{ - lookup_hint, lookup_visit, AnyVisit, ProtocolId, Visit, VisitorMissingProtocol, - WalkerMissingProtocol, - }, - protocols::reference, - walk::{Walk, WalkMut, WalkOnce}, - ControlFlow, Visitor, Walker, -}; - -impl<'borrow, 'ctx, T> WalkOnce<'ctx> for &'borrow mut T -where - T: WalkMut<'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_mut(self, visitor) - } -} - -impl<'borrow, 'ctx, T> WalkMut<'borrow, 'ctx> for &'borrow mut T -where - T: WalkMut<'borrow, 'ctx>, -{ - fn walk_mut( - &'borrow mut self, - visitor: &mut dyn Visitor<'ctx>, - ) -> Result<Self::Value, Self::Error> { - T::walk_mut(self, visitor) - } -} - -impl<'borrow, 'ctx, T> Walk<'borrow, 'ctx> for &'borrow mut T -where - T: Walk<'borrow, '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 mut T { - type Builder = MutBuilder<'ctx, T>; -} - -pub struct MutWalker<'ctx, T: ?Sized> { - value: Option<&'ctx mut T>, -} - -impl<'ctx, T: ?Sized> MutWalker<'ctx, T> { - pub fn new(value: &'ctx mut T) -> Self { - Self { - value: Some(value), - } - } -} - -impl<'ctx, T: ?Sized + Any> WalkOnce<'ctx> for MutWalker<'ctx, T> { - type Error = VisitorMissingProtocol; - - type Value = (); - - fn walk_once(mut self, visitor: &mut dyn Visitor<'ctx>) -> Result<Self::Value, Self::Error> { - if let Some(value) = self.value.take() { - let visit = lookup_visit::<reference::ReferenceMut<T>, _>(visitor)?; - visit.visit(reference::Mut::Context(value)); - } - Ok(()) - } -} - -#[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 MutBuilder<'ctx, T: ?Sized> { - value: Option<Result<&'ctx mut T, Error>>, -} - -impl<'ctx, T: ?Sized> Default for MutBuilder<'ctx, T> { - fn default() -> Self { - Self { value: None } - } -} - -impl<'ctx, T: ?Sized + Any> Builder<'ctx> for MutBuilder<'ctx, T> { - type Error = Error; - - type Value = &'ctx mut 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 MutBuilder<'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::ReferenceMut<T>>() { - Some(AnyVisit::new(self)) - } else { - None - } - } -} - -impl<'ctx, T: ?Sized + Any> Visit<'ctx, reference::ReferenceMut<T>> for MutBuilder<'ctx, T> { - fn visit(&mut self, accessor: reference::Mut<'_, 'ctx, T>) -> ControlFlow { - match accessor { - reference::Mut::Walking(_) => { - self.value = Some(Err(Error::ShortLifetime)); - ControlFlow::Continue - } - reference::Mut::Context(value) | reference::Mut::Static(value) => { - self.value = Some(Ok(value)); - ControlFlow::Done - } - } - } -} |