Diffstat (limited to 'src/impls/core/str.rs')
-rw-r--r--src/impls/core/str.rs75
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(()),
+ }
+ }
+}
+