working structs
Konnor Andrews 2024-07-07
parent 440b093 · commit 8f8f43e
-rw-r--r--src/build/builders/core/bool.rs14
-rw-r--r--src/macros/build.rs45
-rw-r--r--tests/builder_struct.rs2
3 files changed, 26 insertions, 35 deletions
diff --git a/src/build/builders/core/bool.rs b/src/build/builders/core/bool.rs
index 5001ba6..8596fbb 100644
--- a/src/build/builders/core/bool.rs
+++ b/src/build/builders/core/bool.rs
@@ -4,23 +4,13 @@ use crate::any::{
};
use effectful::bound::{Dynamic, IsSync};
use effectful::environment::{DynBind, Environment};
+use crate::Builder;
macro_rules! value_builder {
[$($ty:ty),*] => {
$(impl<'ctx, M, E: Environment> crate::Build<'ctx, M, E> for $ty
where
- Dynamic<Self>: DynBind<E>,
- for<'a> Dynamic<&'a Self>: DynBind<E>,
- Dynamic<OwnedStatic<Self>>: DynBind<E>,
- for<'a> Dynamic<&'a OwnedStatic<Self>>: DynBind<E>,
- Dynamic<BorrowedStatic<'ctx, Self>>: DynBind<E>,
- for<'a, 'b> Dynamic<&'a BorrowedStatic<'b, Self>>: DynBind<E>,
- for<'a> Dynamic<TempBorrowedStatic<'a, Self>>: DynBind<E>,
- for<'a> Dynamic<&'a TempBorrowedStatic<'a, Self>>: DynBind<E>,
- Dynamic<BorrowedMutStatic<'ctx, Self>>: DynBind<E>,
- for<'a, 'b> Dynamic<&'a BorrowedMutStatic<'b, Self>>: DynBind<E>,
- for<'a> Dynamic<TempBorrowedMutStatic<'a, Self>>: DynBind<E>,
- for<'a> Dynamic<&'a TempBorrowedMutStatic<'a, Self>>: DynBind<E>,
+ ValueBuilder<$ty, Cloneable, E>: Builder<'ctx, E, Value = Self>,
{
type Builder = ValueBuilder<$ty, Cloneable, E>;
})*
diff --git a/src/macros/build.rs b/src/macros/build.rs
index 4272bed..a0ad6ab 100644
--- a/src/macros/build.rs
+++ b/src/macros/build.rs
@@ -100,32 +100,35 @@ macro_rules! Build {
fn new_builders<'a>(seed: Self::Seed) -> effectful::environment::NativeForm<'a, Self::Builders, E> {
let ($($field),*) = seed;
- todo!()
-
- // $crate::effect::join(
- // ($(<<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::Builder::<E>>::from_seed($field),)*)
- // ).map(|($($field,)*)| {
- // Builders {
- // $($field),*
- // }
- // })
+ use effectful::effective::Effective;
+
+ effectful::effective::join(
+ ($(<<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::Builder::<E>>::from_seed($field),)*)
+ ).map((), |_, ($($field,)*)| {
+ Builders {
+ $($field),*
+ }
+ })
+ .cast()
}
fn from_builders<'a>(builders: Self::Builders) -> effectful::environment::NativeForm<'a, Result<effectful::bound::Dynamic<Self::T>, Self::Error>, E> {
use $crate::Builder;
- todo!()
-
- // $crate::effect::try_join(
- // (
- // $(|| builders.$field.build().map(|x| x.map_err(Error::$field)),)*
- // )
- // ).map(|result| match result {
- // Ok(($($field,)*)) => Ok($name {
- // $($field),*
- // }),
- // Err(err) => Err(err)
- // })
+ use effectful::effective::Effective;
+ use $crate::BuilderTypes;
+
+ effectful::effective::try_join(
+ (
+ $(builders.$field.build().map((), |_, x| x.map(|x| <<$type as Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::unwrap_output(x)).map_err(Error::$field)),)*
+ )
+ ).map((), |_, result| match result {
+ Ok(($($field,)*)) => Ok(effectful::bound::Dynamic($name {
+ $($field),*
+ })),
+ Err(err) => Err(err)
+ })
+ .cast()
}
fn as_visitor<'a>(
diff --git a/tests/builder_struct.rs b/tests/builder_struct.rs
index 1a8ec6f..1149b9b 100644
--- a/tests/builder_struct.rs
+++ b/tests/builder_struct.rs
@@ -1,4 +1,3 @@
-/*
use effectful::SendSync;
use macro_rules_attribute::derive;
use treaty::{
@@ -149,4 +148,3 @@ fn a_struct_builder_can_build_from_a_sequence_of_keyed_values() {
// The struct is built as the mock walker above makes it.
assert_eq!(builder.build().into_value().unwrap().0, X { a: false, b: true });
}
-*/