Diffstat (limited to 'tests/demo.rs')
| -rw-r--r-- | tests/demo.rs | 70 |
1 files changed, 43 insertions, 27 deletions
diff --git a/tests/demo.rs b/tests/demo.rs index 9812ef6..c644f73 100644 --- a/tests/demo.rs +++ b/tests/demo.rs @@ -6,9 +6,9 @@ use treaty::{ into_walker, protocol::{ visitor::{Sequence, SequenceScope, Value}, - ControlFlowFor, SyncEffect, Visitor, + Yield, SyncEffect, Visitor, }, - Builder, Walk, Walker, + AsVisitor, Builder, Walk, Walker, }; #[test] @@ -22,12 +22,12 @@ fn demo() { dbg!(array_to_array2([true, false])); dbg!(array_to_array([true, true])); - let s = build_with::<array::Builder<'_, JsonLike, 3>, _>(into_walker(&a)).unwrap(); + let s = build_with::<array::Builder<'_, JsonLike, 3, _>, _>(into_walker(&a)).unwrap(); dbg!(s); use treaty::builders::serde::deserialize::Builder as SerdeBuilder; - let x = build_with::<SerdeBuilder<serde_json::Value>, _>(into_walker(&a)).unwrap(); + let x = build_with::<SerdeBuilder<serde_json::Value, _>, _>(into_walker(&a)).unwrap(); dbg!(x); // let s = build_with::<JsonLike, _>(into_walker(a)).unwrap(); @@ -74,32 +74,38 @@ const _: () = { fn walk<'a>( self, - visitor: &'a mut Visitor<'a, 'ctx>, - ) -> ControlFlowFor<'a, SyncEffect, Self::Error, Self::Output> { + visitor: Visitor<'a, 'ctx, SyncEffect>, + ) -> Yield<'a, 'ctx, Result<Self::Output, Self::Error>, SyncEffect> + where + 'ctx: 'a, + { match self.0 { Data::Bool(value) => walk_bool(*value, visitor), Data::Sequence(value) => walk_vec(value, visitor), } - core::ops::ControlFlow::Continue(()) + Ok(()) } } }; -fn walk_bool(value: bool, visitor: &mut Visitor<'_, '_>) { +fn walk_bool(value: bool, visitor: Visitor<'_, '_, SyncEffect>) { visitor - .upcast_mut::<dyn Value<OwnedStatic<bool>>>() + .upcast_mut::<dyn Value<OwnedStatic<bool>, SyncEffect>>() .unwrap() .visit(OwnedStatic(value)); } -fn walk_vec<'a, 'ctx>(value: &'ctx [Data], visitor: &'a mut Visitor<'a, 'ctx>) { +fn walk_vec<'a, 'ctx>(value: &'ctx [Data], visitor: Visitor<'a, 'ctx, SyncEffect>) { struct Scope<'ctx>(VecDeque<&'ctx Data>); - impl<'ctx> SequenceScope<'ctx> for Scope<'ctx> { + impl<'ctx> SequenceScope<'ctx, SyncEffect> for Scope<'ctx> { fn next<'a>( &'a mut self, - visitor: &'a mut Visitor<'a, 'ctx>, - ) -> ControlFlowFor<'a, SyncEffect, treaty::protocol::visitor::Status> { + visitor: Visitor<'a, 'ctx, SyncEffect>, + ) -> Yield<'a, 'ctx, ControlFlow<(), treaty::protocol::visitor::Status>, SyncEffect> + where + 'ctx: 'a, + { if let Some(value) = self.0.pop_front() { into_walker(value).walk(visitor); @@ -113,7 +119,7 @@ fn walk_vec<'a, 'ctx>(value: &'ctx [Data], visitor: &'a mut Visitor<'a, 'ctx>) { let mut scope = Scope(value.into_iter().collect()); visitor - .upcast_mut::<dyn Sequence<'_>>() + .upcast_mut::<dyn Sequence<'_, SyncEffect>>() .unwrap() .visit(&mut scope); } @@ -121,16 +127,12 @@ fn walk_vec<'a, 'ctx>(value: &'ctx [Data], visitor: &'a mut Visitor<'a, 'ctx>) { #[derive(Default)] struct JsonLike(String); -impl<'ctx> Builder<'ctx> for JsonLike { +impl<'ctx> Builder<'ctx, SyncEffect> for JsonLike { type Error = (); type Value = String; - fn as_visitor(&mut self) -> &mut Visitor<'_, 'ctx> { - self - } - - fn build(self) -> Result<Self::Value, Self::Error> { + fn build<'a>(self) -> Result<Self::Value, Self::Error> where Self: 'a { Ok(self.0) } @@ -139,27 +141,41 @@ impl<'ctx> Builder<'ctx> for JsonLike { fn from_seed(seed: Self::Seed) -> Self { Self::default() } + + type Effect = SyncEffect; +} + +impl<'ctx> AsVisitor<'ctx, SyncEffect> for JsonLike { + fn as_visitor(&mut self) -> Visitor<'_, 'ctx, SyncEffect> { + self + } } any_trait! { impl['a, 'ctx] JsonLike = [ - dyn Value<'a, OwnedStatic<bool>> + 'a, - dyn Sequence<'ctx> + 'a, + dyn Value<'ctx, OwnedStatic<bool>, SyncEffect> + 'a, + dyn Sequence<'ctx, SyncEffect> + 'a, ] } -impl Value<'_, OwnedStatic<bool>> for JsonLike { - fn visit(&mut self, value: OwnedStatic<bool>) -> ControlFlowFor<'_> { +impl<'ctx> Value<'ctx, OwnedStatic<bool>, SyncEffect> for JsonLike { + fn visit<'a>(&'a mut self, value: OwnedStatic<bool>) -> Yield<'a, 'ctx, ControlFlow<(), ()>, SyncEffect> + where + 'ctx: 'a, + { self.0.push_str(&format!("{}", value.0)); ControlFlow::Continue(()) } } -impl<'ctx> Sequence<'ctx> for JsonLike { +impl<'ctx> Sequence<'ctx, SyncEffect> for JsonLike { fn visit<'a>( &'a mut self, - scope: &'a mut dyn SequenceScope<'ctx>, - ) -> ControlFlowFor<'a, SyncEffect> { + scope: &'a mut dyn SequenceScope<'ctx, SyncEffect>, + ) -> Yield<'a, 'ctx, ControlFlow<(), ()>, SyncEffect> + where + 'ctx: 'a, + { self.0.push_str("["); while let ControlFlow::Continue(treaty::protocol::visitor::Status::Continue) = scope.next(self) |