Diffstat (limited to 'src/impls.rs')
| -rw-r--r-- | src/impls.rs | 143 |
1 files changed, 3 insertions, 140 deletions
diff --git a/src/impls.rs b/src/impls.rs index 1c4d788..80670f0 100644 --- a/src/impls.rs +++ b/src/impls.rs @@ -1,141 +1,4 @@ -use crate::{ - lookup_hint, lookup_visit, - protocol::{AnyHint, AnyVisit, Protocol, ProtocolId}, - protocols::{self, str::Str}, - BasicError, Buildable, Error, Hint, HintGiven, Hints, Walkable, WalkableRef, -}; +#[cfg(feature = "alloc")] +pub mod alloc; -const _: () = { - pub struct Walker<'value>(&'value str); - - impl<'value> crate::Walker<'value> for Walker<'value> { - type Error = BasicError; - - fn hints(&mut self) -> &mut dyn Hints<'value, Self::Error> { - self - } - } - - impl<'value, Err: Error<'value>> Hints<'value, Err> for Walker<'value> { - fn protocol(&mut self, id: ProtocolId) -> Option<AnyHint<'_, 'value, Err>> { - match id { - id if id == ProtocolId::of::<Str>() => Some(AnyHint::new(self)), - _ => None, - } - } - } - - impl<'value, Err: Error<'value>> Hint<'value, Str, Err> for Walker<'value> { - fn hint( - &mut self, - visitor: &mut dyn crate::Visitor<'value, Err>, - _hint: <Str as crate::protocol::Protocol>::Hint, - ) -> Result<HintGiven, Err> { - lookup_visit::<Str, _, _>(visitor)? - .ok_or_else(Err::missing_visit::<Str>)? - .visit(protocols::str::Data::Value(self.0))?; - - Ok(HintGiven) - } - - fn known( - &mut self, - _hint: &<Str as crate::protocol::Protocol>::Hint, - ) -> Result<<Str as crate::protocol::Protocol>::Known, Err> { - Ok(protocols::str::Known { - len: Some(self.0.len()), - kind: Some(protocols::str::Kind::Value), - }) - } - } - - impl<'walking, 'value: 'walking> Walkable<'walking, 'value> for &'value str { - type Walker = Walker<'value>; - - fn walker(&'walking mut self) -> Self::Walker { - Walker(self) - } - } - - impl<'walking, 'value: 'walking> WalkableRef<'walking, 'value> for &'value str { - fn walker_ref(&'walking self) -> Self::Walker { - Walker(self) - } - } - - pub struct Visitor<'value>(Option<&'value str>); - - impl<'value, Err: Error<'value>> crate::Visitor<'value, Err> for Visitor<'value> { - fn request_hint( - &mut self, - hints: &mut dyn Hints<'value, Err>, - ) -> Result<Option<HintGiven>, Err> { - if let Some(hint) = lookup_hint::<Str, _, _>(hints)? { - Ok(Some(hint.hint( - self, - protocols::str::Hint { - kind: Some(protocols::str::Kind::Value), - min_len: None, - max_len: None, - }, - )?)) - } else { - Ok(None) - } - } - - fn protocol(&mut self, id: ProtocolId) -> Option<AnyVisit<'_, 'value, Err>> { - match id { - id if id == ProtocolId::of::<Str>() => Some(AnyVisit::new(self)), - _ => None, - } - } - } - - impl<'value, Err: Error<'value>> crate::Visit<'value, Str, Err> for Visitor<'value> { - fn visit<'walking>( - &'walking mut self, - accessor: <Str as Protocol<'value>>::Accessor<'walking, Err>, - ) -> Result<(), Err> { - match accessor { - protocols::str::Data::Value(str) | protocols::str::Data::Static(str) => { - self.0 = Some(str) - } - protocols::str::Data::Walking(_) => { - return Err(Err::custom("str value does not live long enough")) - } - } - Ok(()) - } - } - - impl<'value, Err: Error<'value>> crate::Builder<'value, Err> for Visitor<'value> { - type Value = &'value str; - - fn init() -> Self - where - Self: Sized, - { - Visitor(None) - } - - fn as_visitor(&mut self) -> &mut dyn crate::Visitor<'value, Err> { - self - } - - fn finish(self) -> Result<Self::Value, Err> - where - Self: Sized, - { - if let Some(str) = self.0 { - Ok(str) - } else { - Err(Err::custom_static_str("missing str")) - } - } - } - - impl<'value, Err: Error<'value>> Buildable<'value, Err> for &'value str { - type Builder = Visitor<'value>; - } -}; +pub mod core; |