Diffstat (limited to 'src/build/builders/debug.rs')
| -rw-r--r-- | src/build/builders/debug.rs | 107 |
1 files changed, 87 insertions, 20 deletions
diff --git a/src/build/builders/debug.rs b/src/build/builders/debug.rs index 7cf0aad..3bc9e94 100644 --- a/src/build/builders/debug.rs +++ b/src/build/builders/debug.rs @@ -4,21 +4,28 @@ use crate::{ any::{static_wrapper::OwnedStatic, LtTypeId}, any_trait, effect::{Effect, Future}, - protocol::{visitor::{ - tag::{Dyn, Tag}, - value::Value, request_hint::RequestHint, - }, self}, - DynWalker, + never::Never, + protocol::{ + self, + visitor::{ + request_hint::RequestHint, + tag::{Dyn, Tag, DynTag}, + value::Value, sequence::{DynSequence, Sequence, SequenceFlow}, + }, + }, + DynWalker, Flow, }; -pub struct Walker<E>(usize, PhantomData<fn() -> E>); +pub struct Visitor<E>(usize, PhantomData<fn() -> E>); any_trait! { - impl['a, 'ctx, E] Walker<E> = [ + impl['a, 'ctx, E] Visitor<E> = [ dyn RequestHint<'ctx, Effect = E> + 'a, - dyn Tag<'ctx, Dyn, Effect = E> + 'a, + DynTag<'a, 'ctx, Dyn, E>, dyn Value<'a, 'ctx, OwnedStatic<&'static str>, Effect = E> + 'a, dyn Value<'a, 'ctx, OwnedStatic<TypeId>, Effect = E> + 'a, + dyn Value<'a, 'ctx, OwnedStatic<usize>, Effect = E> + 'a, + DynSequence<'a, 'ctx, E>, ] else fallback where E: Effect<'ctx> } @@ -26,7 +33,7 @@ fn fallback(id: LtTypeId<'_>) { println!("Unknown trait: {}", id); } -impl<'ctx, E: Effect<'ctx>> Walker<E> { +impl<'ctx, E: Effect<'ctx>> Visitor<E> { pub fn new() -> Self { Self(0, PhantomData) } @@ -38,7 +45,7 @@ impl<'ctx, E: Effect<'ctx>> Walker<E> { } } -impl<'ctx, E: Effect<'ctx>> RequestHint<'ctx> for Walker<E> { +impl<'ctx, E: Effect<'ctx>> RequestHint<'ctx> for Visitor<E> { type Effect = E; fn request_hint<'a>( @@ -46,7 +53,7 @@ impl<'ctx, E: Effect<'ctx>> RequestHint<'ctx> for Walker<E> { _walker: crate::protocol::Walker<'a, 'ctx>, ) -> Future<'a, 'ctx, ControlFlow<(), ()>, Self::Effect> where - Self: 'a + Self: 'a, { self.tab(); println!("Visit request hint (no hint given)"); @@ -54,14 +61,14 @@ impl<'ctx, E: Effect<'ctx>> RequestHint<'ctx> for Walker<E> { } } -impl<'ctx, E: Effect<'ctx>> Tag<'ctx, Dyn> for Walker<E> { +impl<'ctx, E: Effect<'ctx>> Tag<'ctx, Dyn> for Visitor<E> { type Effect = E; fn visit<'a>( &'a mut self, kind: Dyn, - walker: &'a mut dyn DynWalker<'ctx, Effect = Self::Effect>, - ) -> Future<'a, 'ctx, ControlFlow<(), protocol::visitor::tag::Status>, Self::Effect> + walker: DynWalker<'a, 'ctx, Self::Effect>, + ) -> Future<'a, 'ctx, Flow<Never>, Self::Effect> where Self: 'a, { @@ -73,29 +80,89 @@ impl<'ctx, E: Effect<'ctx>> Tag<'ctx, Dyn> for Walker<E> { let result = walker.walk(self).await; self.0 -= 1; match result { - ControlFlow::Continue(()) => ControlFlow::Continue(protocol::visitor::tag::Status::Walked), - ControlFlow::Break(()) => ControlFlow::Break(()), + ControlFlow::Continue(()) => Flow::Continue, + ControlFlow::Break(()) => Flow::Break, } }) } } -impl<'a, 'ctx: 'a, E: Effect<'ctx>> Value<'a, 'ctx, OwnedStatic<&'static str>> for Walker<E> { +impl<'a, 'ctx: 'a, E: Effect<'ctx>> Value<'a, 'ctx, OwnedStatic<&'static str>> for Visitor<E> { type Effect = E; - fn visit(&'a mut self, OwnedStatic(value): OwnedStatic<&'static str>) -> Future<'a, 'ctx, ControlFlow<(), ()>, Self::Effect> where Self: 'a { + fn visit( + &'a mut self, + OwnedStatic(value): OwnedStatic<&'static str>, + ) -> Future<'a, 'ctx, ControlFlow<(), ()>, Self::Effect> + where + Self: 'a, + { self.tab(); println!("Visit static str: {:?}", value); E::wrap(async { ControlFlow::Continue(()) }) } } -impl<'a, 'ctx: 'a, E: Effect<'ctx>> Value<'a, 'ctx, OwnedStatic<TypeId>> for Walker<E> { +impl<'a, 'ctx: 'a, E: Effect<'ctx>> Value<'a, 'ctx, OwnedStatic<usize>> for Visitor<E> { + type Effect = E; + + fn visit( + &'a mut self, + OwnedStatic(value): OwnedStatic<usize>, + ) -> Future<'a, 'ctx, ControlFlow<(), ()>, Self::Effect> + where + Self: 'a, + { + self.tab(); + println!("Visit usize: {}", value); + E::wrap(async { ControlFlow::Continue(()) }) + } +} + +impl<'a, 'ctx: 'a, E: Effect<'ctx>> Value<'a, 'ctx, OwnedStatic<TypeId>> for Visitor<E> { type Effect = E; - fn visit(&'a mut self, OwnedStatic(value): OwnedStatic<TypeId>) -> Future<'a, 'ctx, ControlFlow<(), ()>, Self::Effect> where Self: 'a { + fn visit( + &'a mut self, + OwnedStatic(value): OwnedStatic<TypeId>, + ) -> Future<'a, 'ctx, ControlFlow<(), ()>, Self::Effect> + where + Self: 'a, + { self.tab(); println!("Visit type ID: {:?}", value); E::wrap(async { ControlFlow::Continue(()) }) } } + +impl<'ctx, E: Effect<'ctx>> Sequence<'ctx> for Visitor<E> { + type Effect = E; + + fn visit<'a>( + &'a mut self, + scope: protocol::visitor::sequence::DynSequenceScope<'a, 'ctx, Self::Effect>, + ) -> Future<'a, 'ctx, Flow<Never>, Self::Effect> { + self.tab(); + E::wrap(async { + println!("Visit sequence, size hint: {:?}", scope.size_hint().await); + self.0 += 1; + let flow = loop { + self.tab(); + println!("Calling next"); + self.0 += 1; + match scope.next(self).await { + SequenceFlow::Done => { + self.tab(); + println!("Sequence done"); + break Flow::Continue + }, + SequenceFlow::Continue => {}, + SequenceFlow::Break => break Flow::Break, + } + self.0 -= 1; + }; + self.0 -= 2; + flow + }) + } +} |