use core::{any::TypeId, marker::PhantomData}; use crate::{ any::OwnedStatic, any_trait, effect::{Effect, Future}, protocol::{ self, visitor::{ DynSequenceScope, RequestHint, RequestHintProto, Sequence, Tag, TagDyn, TagProto, Value, ValueProto, VisitResult, }, DynVisitor, }, protocol::{visitor::SequenceProto, DynWalker}, DynWalkerObjSafe, Flow, }; pub struct Visitor(usize, PhantomData E>); any_trait! { impl['ctx, E] Visitor = [ RequestHintProto, // DynRecoverable<'a, 'ctx, E>, TagProto, ValueProto, E>, ValueProto, E>, ValueProto, E>, ValueProto, E>, // DynValue<'a, 'ctx, OwnedStatic<&'static [&'static str]>, E>, SequenceProto, ] else ref { let (_this, id); println!("Unknown trait: {:?}", id); None } else mut { let (_this, id); println!("Unknown trait: {:?}", id); None } where E: Effect } impl Default for Visitor { fn default() -> Self { Self::new() } } impl Visitor { pub fn new() -> Self { Self(0, PhantomData) } fn tab(&self) { if self.0 > 0 { for _ in 0..self.0 - 1 { print!(" | "); } print!(" |-"); } } } impl<'ctx, E: Effect> RequestHint<'ctx, E> for Visitor { fn request_hint<'a>( &'a mut self, _walker: DynWalker<'a, 'ctx>, ) -> Future<'a, VisitResult>, E> { // self.tab(); // println!("Visit request hint (no hint given)"); // println!("Visit request hint (hint for recoverable)"); E::ready(Flow::Continue.into()) } } impl<'ctx, E: Effect> Tag<'ctx, TagDyn, E> for Visitor { fn visit<'a>( &'a mut self, kind: TagDyn, walker: DynWalkerObjSafe<'a, 'ctx, E>, ) -> Future<'a, VisitResult>, E> { E::wrap(async move { match kind.0 { crate::TAG_TYPE_NAME => { self.tab(); println!("type name:"); self.0 += 1; let _ = walker.walk(DynVisitor(self)).await; self.0 -= 1; Flow::Continue.into() } crate::TAG_KEY => { self.tab(); println!("key:"); self.0 += 1; let _ = walker.walk(DynVisitor(self)).await; self.0 -= 1; Flow::Continue.into() } crate::TAG_VALUE => { self.tab(); println!("value:"); self.0 += 1; let _ = walker.walk(DynVisitor(self)).await; self.0 -= 1; Flow::Continue.into() } _ => VisitResult::Skipped(walker), } }) } } impl<'ctx, E: Effect> Value<'ctx, OwnedStatic<&'static str>, E> for Visitor { fn visit<'a>( &'a mut self, OwnedStatic(value): OwnedStatic<&'static str>, ) -> Future<'a, VisitResult>, E> where 'ctx: 'a, { self.tab(); println!("{:?}", value); E::ready(Flow::Continue.into()) } } impl<'ctx, E: Effect> Value<'ctx, OwnedStatic, E> for Visitor { fn visit<'a>( &'a mut self, OwnedStatic(value): OwnedStatic, ) -> Future<'a, VisitResult>, E> where 'ctx: 'a, { self.tab(); println!("{}", value); E::ready(Flow::Continue.into()) } } impl<'ctx, E: Effect> Value<'ctx, OwnedStatic, E> for Visitor { fn visit<'a>( &'a mut self, OwnedStatic(value): OwnedStatic, ) -> Future<'a, VisitResult>, E> where 'ctx: 'a, { self.tab(); println!("{}", value); E::ready(Flow::Continue.into()) } } impl<'ctx, E: Effect> Value<'ctx, OwnedStatic<&'static [&'static str]>, E> for Visitor { fn visit<'a>( &'a mut self, OwnedStatic(value): OwnedStatic<&'static [&'static str]>, ) -> Future<'a, VisitResult>, E> where 'ctx: 'a, { self.tab(); println!("{:?}", value); E::ready(Flow::Continue.into()) } } impl<'ctx, E: Effect> Value<'ctx, OwnedStatic, E> for Visitor { fn visit<'a>( &'a mut self, OwnedStatic(value): OwnedStatic, ) -> Future<'a, VisitResult>, E> where 'ctx: 'a, { self.tab(); println!("Visit type ID: {:?}", value); E::ready(Flow::Continue.into()) } } impl<'ctx, E: Effect> Sequence<'ctx, E> for Visitor { fn visit<'a>( &'a mut self, scope: protocol::visitor::DynSequenceScope<'a, 'ctx, E>, ) -> Future<'a, VisitResult>, E> { E::wrap(async { self.tab(); println!("sequence{:?}", scope.size_hint().await); self.0 += 1; let mut index = 0; let flow = loop { self.tab(); println!("{}:", index); self.0 += 1; match scope.next(DynVisitor(self)).await { Flow::Done => { self.tab(); println!(""); break Flow::Continue; } Flow::Continue => {} Flow::Err => break Flow::Err, } index += 1; self.0 -= 1; }; self.0 -= 2; flow.into() }) } }