Diffstat (limited to 'src/transform.rs')
| -rw-r--r-- | src/transform.rs | 44 |
1 files changed, 23 insertions, 21 deletions
diff --git a/src/transform.rs b/src/transform.rs index 5fbcb79..2e3d14b 100644 --- a/src/transform.rs +++ b/src/transform.rs @@ -1,28 +1,30 @@ use crate::{ - build::{Build, Builder}, - walk::Walk, + build::Builder, + effect::{Effect, Future}, Walker, }; -#[derive(thiserror::Error, Debug)] -pub enum Either<A, B> { - #[error(transparent)] - A(A), +#[inline] +pub fn transform< + 'a, + 'ctx, + B: Builder<'ctx, Effect = E> + 'a, + W: Walker<'ctx, Effect = E> + 'a, + E: Effect<'ctx>, +>( + seed: B::Seed, + walker: W, +) -> Future<'a, 'ctx, (Result<B::Value, B::Error>, Result<W::Output, W::Error>), E> { + E::wrap(async { + // Create builder from seed value; + let mut builder = B::from_seed(seed).await; - #[error(transparent)] - B(B), -} + // Walk the walker with the builder as the visitor. + let walker_result = walker.walk(builder.as_visitor()).await; + + // Finish building the value. + let builder_result = builder.build().await; -pub fn from<'ctx, U, T>( - value: T, -) -> Result<U, Either<<T::Walker as Walker<'ctx>>::Error, <U::Builder as Builder<'ctx>>::Error>> -where - T: Walk<'ctx>, - U: Build<'ctx>, -{ - let mut builder = U::Builder::default(); - T::Walker::from(value) - .walk(builder.as_visitor()) - .map_err(Either::A)?; - builder.build().map_err(Either::B) + (builder_result, walker_result) + }) } |