Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs34
1 files changed, 26 insertions, 8 deletions
diff --git a/src/lib.rs b/src/lib.rs
index a371500..7f38206 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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 });
}
}