Diffstat (limited to 'src/transform.rs')
| -rw-r--r-- | src/transform.rs | 43 |
1 files changed, 37 insertions, 6 deletions
diff --git a/src/transform.rs b/src/transform.rs index f055fcb..4d9e99d 100644 --- a/src/transform.rs +++ b/src/transform.rs @@ -1,6 +1,10 @@ +use futures::Future; + use crate::{ build::Builder, - effect::{blocking::Blocking, Effect, Effective, EffectiveExt, ErasedEffective}, + effect::{ + blocking::Blocking, r#async::Async, Effect, Effective, EffectiveExt, ErasedEffective, + }, Build, BuilderTypes, DefaultMode, Walk, Walker, WalkerTypes, }; @@ -70,6 +74,26 @@ pub trait BuildExt { } } + fn build_async<'ctx, W>( + walker: W, + ) -> impl Future<Output = Result<Self, BuildError<Self::Builder, W>>> + Send + Sync + where + Self: Build<'ctx, DefaultMode, Async>, + <Self::Builder as BuilderTypes>::Seed: Default, + W: Walker<'ctx, Async>, + { + async { + match transform::<Self::Builder, _, _>(Default::default(), walker) + .into_future() + .await + { + (Ok(value), _) => Ok(value), + (Err(err), Ok(_)) => Err(BuildError::Builder(err)), + (Err(build_err), Err(walker_err)) => Err(BuildError::Both(build_err, walker_err)), + } + } + } + fn new_builder<'ctx>() -> Self::Builder where Self: Build<'ctx, DefaultMode, Blocking>, @@ -82,13 +106,20 @@ pub trait BuildExt { impl<T> BuildExt for T {} pub trait WalkExt { - fn as_walker<'ctx: 'a, 'a, E: Effect>( + fn as_walker<'ctx: 'a, 'a>(&'a self) -> <&'a Self as Walk<'ctx, DefaultMode, Blocking>>::Walker + where + &'a Self: Walk<'ctx, DefaultMode, Blocking>, + { + Walk::into_walker(self).value() + } + + fn as_async_walker<'ctx: 'a, 'a>( &'a self, - ) -> <&'a Self as Walk<'ctx, DefaultMode, E>>::Walker + ) -> impl Future<Output = <&'a Self as Walk<'ctx, DefaultMode, Async>>::Walker> + Send + Sync where - &'a Self: Walk<'ctx, DefaultMode, E>, + &'a Self: Walk<'ctx, DefaultMode, Async>, { - Walk::into_walker(self) + Walk::into_walker(self).into_future() } #[allow(clippy::result_unit_err)] @@ -98,7 +129,7 @@ pub trait WalkExt { B: Builder<'ctx, Blocking>, { let mut builder = builder; - Walk::into_walker(self).walk(builder.as_visitor()); + let _ = Walk::into_walker(self).value().walk(builder.as_visitor()); match builder.build().value() { Ok(value) => Ok(value), _ => todo!(), |