Diffstat (limited to 'src/impls/core/str.rs')
| -rw-r--r-- | src/impls/core/str.rs | 75 |
1 files changed, 68 insertions, 7 deletions
diff --git a/src/impls/core/str.rs b/src/impls/core/str.rs index 021fc11..e09b219 100644 --- a/src/impls/core/str.rs +++ b/src/impls/core/str.rs @@ -1,13 +1,74 @@ -use crate::{error::PrimitiveTypeError, walk::Walk}; +use crate::{walk::{Walk, WalkOnce, WalkMut}, protocol::VisitorMissingProtocol, Walker, Visitor}; -use super::reference::{RefWalker, ValueLifetime}; +use super::{reference::RefWalker, reference_mut::MutWalker}; -impl<'value, 'borrow: 'value, 'ctx: 'borrow> Walk<'value, 'borrow, 'ctx> for str { - type Error = PrimitiveTypeError; +impl<'ctx> WalkOnce<'ctx> for &'ctx str { + type Error = VisitorMissingProtocol; - type Walker<VisitorErr: 'value> = RefWalker<'borrow, str, ValueLifetime>; + type Value = (); - fn walker<VisitorErr: 'value>(&'borrow self) -> Self::Walker<VisitorErr> { - RefWalker::new(self) + #[inline] + fn walk_once(self, visitor: &mut dyn Visitor<'ctx>) -> Result<Self::Value, Self::Error> { + self.walk(visitor) } } + +impl<'borrow, 'ctx> WalkMut<'borrow, 'ctx> for &'ctx str { + #[inline] + fn walk_mut(&'borrow mut self, visitor: &mut dyn Visitor<'ctx>) -> Result<Self::Value, Self::Error> { + self.walk(visitor) + } +} + +impl<'borrow, 'ctx> Walk<'borrow, 'ctx> for &'ctx str { + #[inline] + fn walk(&'borrow self, visitor: &mut dyn Visitor<'ctx>) -> Result<Self::Value, Self::Error> { + let mut walker = RefWalker::new(*self); + let _ = walker.walk(visitor); + match walker.into_error() { + Some(err) => Err(err), + None => Ok(()), + } + } +} + +impl<'ctx> WalkOnce<'ctx> for &'ctx mut str { + type Error = VisitorMissingProtocol; + + type Value = (); + + #[inline] + fn walk_once(self, visitor: &mut dyn Visitor<'ctx>) -> Result<Self::Value, Self::Error> { + let mut walker = MutWalker::new(self); + let _ = walker.walk(visitor); + match walker.into_error() { + Some(err) => Err(err), + None => Ok(()), + } + } +} + +impl<'ctx> WalkMut<'ctx, 'ctx> for &'ctx mut str { + #[inline] + fn walk_mut(&'ctx mut self, visitor: &mut dyn Visitor<'ctx>) -> Result<Self::Value, Self::Error> { + let mut walker = MutWalker::new(*self); + let _ = walker.walk(visitor); + match walker.into_error() { + Some(err) => Err(err), + None => Ok(()), + } + } +} + +impl<'ctx> Walk<'ctx, 'ctx> for &'ctx mut str { + #[inline] + fn walk(&'ctx self, visitor: &mut dyn Visitor<'ctx>) -> Result<Self::Value, Self::Error> { + let mut walker = RefWalker::new(*self); + let _ = walker.walk(visitor); + match walker.into_error() { + Some(err) => Err(err), + None => Ok(()), + } + } +} + |