Diffstat (limited to 'tests/demo.rs')
| -rw-r--r-- | tests/demo.rs | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/tests/demo.rs b/tests/demo.rs index 6f3565b..9baf602 100644 --- a/tests/demo.rs +++ b/tests/demo.rs @@ -1,9 +1,10 @@ -use std::{any::TypeId, collections::VecDeque, ops::ControlFlow}; +use std::{collections::VecDeque, ops::ControlFlow}; use treaty::{ any::{any_trait, static_wrapper::OwnedStatic}, + build_with, into_walker, protocol::{ visitor::{Sequence, SequenceScope, Value}, - Visitor, + SyncEffect, Visitor, }, Builder, Walk, Walker, }; @@ -16,11 +17,9 @@ fn demo() { Data::Bool(false), ]); - let mut builder = JsonLike::default(); - <Data as Walk>::Walker::from(a).walk(builder.as_visitor()).unwrap(); - dbg!(builder.build().unwrap()); + let s = build_with::<JsonLike, _>(into_walker(a)).unwrap(); - todo!() + assert_eq!(s, "[true,[false,true,],false,]"); } #[derive(Debug)] @@ -43,37 +42,42 @@ const _: () = { } impl<'ctx> Walker<'ctx> for Impl { + type Effect = SyncEffect; + type Error = (); type Output = (); - fn walk(self, visitor: Visitor<'_, 'ctx>) -> Result<Self::Output, Self::Error> { + fn walk( + self, + visitor: &mut Visitor<'ctx>, + ) -> core::ops::ControlFlow<Self::Error, Self::Output> { match self.0 { Data::Bool(value) => walk_bool(value, visitor), Data::Sequence(value) => walk_vec(value, visitor), } - Ok(()) + core::ops::ControlFlow::Continue(()) } } }; -fn walk_bool(value: bool, visitor: Visitor<'_, '_>) { +fn walk_bool(value: bool, visitor: &mut Visitor<'_>) { visitor .upcast_mut::<dyn Value<OwnedStatic<bool>>>() .unwrap() .visit(OwnedStatic(value)); } -fn walk_vec(value: Vec<Data>, visitor: Visitor<'_, '_>) { +fn walk_vec(value: Vec<Data>, visitor: &mut Visitor<'_>) { struct Scope(VecDeque<Data>); impl<'ctx> SequenceScope<'ctx> for Scope { fn next( &mut self, - visitor: Visitor<'_, 'ctx>, - ) -> treaty::protocol::ControlFlow<(), treaty::protocol::visitor::Status> { + visitor: &mut Visitor<'ctx>, + ) -> core::ops::ControlFlow<(), treaty::protocol::visitor::Status> { if let Some(value) = self.0.pop_front() { - <<Data as Walk>::Walker>::from(value).walk(visitor).unwrap(); + into_walker(value).walk(visitor); ControlFlow::Continue(treaty::protocol::visitor::Status::Continue) } else { @@ -98,7 +102,7 @@ impl<'ctx> Builder<'ctx> for JsonLike { type Value = String; - fn as_visitor(&mut self) -> Visitor<'_, 'ctx> { + fn as_visitor(&mut self) -> &mut Visitor<'ctx> { self } @@ -109,20 +113,20 @@ impl<'ctx> Builder<'ctx> for JsonLike { any_trait! { impl['a, 'ctx] JsonLike = [ - dyn Value<OwnedStatic<bool>> + 'a, + dyn Value<'a, OwnedStatic<bool>> + 'a, dyn Sequence<'ctx> + 'a, ]; } -impl Value<OwnedStatic<bool>> for JsonLike { - fn visit(&mut self, value: OwnedStatic<bool>) -> treaty::protocol::ControlFlow { +impl Value<'_, OwnedStatic<bool>> for JsonLike { + fn visit(&mut self, value: OwnedStatic<bool>) -> core::ops::ControlFlow<()> { self.0.push_str(&format!("{}", value.0)); ControlFlow::Continue(()) } } impl<'ctx> Sequence<'ctx> for JsonLike { - fn visit(&mut self, scope: &mut dyn SequenceScope<'ctx>) -> treaty::protocol::ControlFlow { + fn visit(&mut self, scope: &mut dyn SequenceScope<'ctx>) -> core::ops::ControlFlow<()> { self.0.push_str("["); while let ControlFlow::Continue(treaty::protocol::visitor::Status::Continue) = scope.next(self) |