Diffstat (limited to 'src/macros/build.rs')
| -rw-r--r-- | src/macros/build.rs | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/src/macros/build.rs b/src/macros/build.rs index 2734d2d..2a45c0a 100644 --- a/src/macros/build.rs +++ b/src/macros/build.rs @@ -44,10 +44,19 @@ macro_rules! Build { type Error = Error; type Seed = ($(<$type as $crate::BuilderTypes>::Seed),*); + #[inline(always)] fn new_builders<'a>(seed: Self::Seed) -> $crate::effect::ObjSafe<'a, Self::Builders, E> { let ($($field),*) = seed; - todo!(); + use $crate::effect::Adapters; + + E::join( + $crate::effect::Join(($(<<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::Builder::<E>>::from_seed($field),)*), $crate::hkt::Marker::default()) + ).map(|($($field,)*)| { + Builders { + $($field),* + } + }).into() // E::wrap(async move { // Builders { @@ -58,8 +67,19 @@ macro_rules! Build { fn from_builders<'a>(builders: Self::Builders) -> $crate::effect::ObjSafe<'a, Result<Self::T, Self::Error>, E> { use $crate::Builder; + use $crate::effect::Adapters; + + E::try_join( + $crate::effect::Join(( + $(builders.$field.build().map(|x| x.map_err(Error::$field)).into(),)* + ), $crate::hkt::Marker::default()) + ).map(|result| match result { + Ok(($($field,)*)) => Ok($name { + $($field),* + }), + Err(err) => Err(err) + }).into() - todo!(); // E::wrap(async { // Ok($name { // $($field: builders.$field.build().await.map_err(Error::$field)?),* |