Diffstat (limited to 'src/lib.rs')
| -rw-r--r-- | src/lib.rs | 34 |
1 files changed, 26 insertions, 8 deletions
@@ -125,8 +125,8 @@ macro_rules! Walk { impl<'ctx, M: 'ctx, E: $crate::effect::Effect> $crate::Walk<'ctx, M, E> for &'ctx $name { type Walker = $crate::walkers::core::r#struct::StructWalker<'ctx, Info, $crate::any::StaticType, M, E>; - fn into_walker(self) -> Self::Walker { - $crate::walkers::core::r#struct::StructWalker::new(self) + fn into_walker<'e>(self) -> $crate::effect::ErasedEffective<'e, Self::Walker, E> { + E::ready($crate::walkers::core::r#struct::StructWalker::new(self)) } } @@ -173,11 +173,13 @@ macro_rules! Walk { $(fields::$field => { let key_walker = $crate::walkers::core::value::ValueWalker::new(stringify!($field)); - let value_walker = <&'ctx $type as $crate::Walk::<'ctx, M, E>>::into_walker(&value.$field); + <&'ctx $type as $crate::Walk::<'ctx, M, E>>::into_walker(&value.$field) + .then(|value_walker| { + let walker = $crate::walkers::core::key_value::KeyValueWalker::<$crate::protocol::visitor::TagConst<{ $crate::TAG_FIELD.to_int() }>, _, _>::new($crate::protocol::visitor::TagConst, key_walker, value_walker); - let walker = $crate::walkers::core::key_value::KeyValueWalker::<$crate::protocol::visitor::TagConst<{ $crate::TAG_FIELD.to_int() }>, _, _>::new($crate::protocol::visitor::TagConst, key_walker, value_walker); - - $crate::Walker::<'ctx, E>::walk(walker, visitor).map(|result| match result { + $crate::Walker::<'ctx, E>::walk(walker, visitor) + }) + .map(|result| match result { Ok(_) => { Ok($crate::Flow::Continue) } @@ -261,12 +263,28 @@ pub mod demo { #[inline(never)] pub fn ident(x: X) -> Y { - // Y::build(x.as_walker()).unwrap() - x.walk(Y::new_builder()).unwrap() + Y::build(x.as_walker()).unwrap() + // x.walk(Y::new_builder()).unwrap() } #[test] fn demo() { + use crate::effect::blocking::BlockOn as _; + assert_eq!(ident(X { a: true, b: false }), Y { a: true, b: false }); + + crate::effect::blocking::Spin::block_on(async { + let x = X { a: false, b: true }; + + let y = Y::build_async(x.as_async_walker().await).await.unwrap(); + + assert_eq!(y, Y { a: false, b: true }); + }); + + let x = X { a: false, b: true }; + + let y = Y::build(x.as_walker()).unwrap(); + + assert_eq!(y, Y { a: false, b: true }); } } |