Diffstat (limited to 'src/transform.rs')
-rw-r--r--src/transform.rs43
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!(),