Diffstat (limited to 'src/macros/build.rs')
| -rw-r--r-- | src/macros/build.rs | 77 |
1 files changed, 46 insertions, 31 deletions
diff --git a/src/macros/build.rs b/src/macros/build.rs index b02c123..2f7e228 100644 --- a/src/macros/build.rs +++ b/src/macros/build.rs @@ -9,19 +9,27 @@ macro_rules! Build { #[allow(non_upper_case_globals, non_snake_case, non_camel_case_types)] const _: () = { // add a module here to seal fields. - impl<'ctx, M: 'ctx, E: $crate::effect::Effect> $crate::Build<'ctx, M, E> for $name { + impl<'ctx, M: 'ctx, E: effectful::environment::Environment> $crate::Build<'ctx, M, E> for $name + where + $name: effectful::environment::DynBind<E> + effectful::bound::IsSync<E::NeedSend> + { type Builder = $crate::builders::core::r#struct::StructBuilder<'ctx, __Info, M, E>; } - $vis struct Builders<'ctx, M: 'ctx, E: $crate::effect::Effect> { + $vis struct Builders<'ctx, M: 'ctx, E: effectful::environment::Environment> { $($field: <$type as $crate::Build<'ctx, M, E>>::Builder),* } + unsafe impl<'ctx, M: 'ctx, E: effectful::environment::Environment> effectful::bound::IsSend<E::NeedSend> for Builders<'ctx, M, E> {} + unsafe impl<'ctx, M: 'ctx, E: effectful::environment::Environment> effectful::bound::IsSync<E::NeedSync> for Builders<'ctx, M, E> {} + #[derive(Copy, Clone, Debug)] $vis enum Field { $($field),* } + effectful::is_send_sync!(Field); + mod field_index { enum __Fields { $($field),* @@ -30,10 +38,13 @@ macro_rules! Build { $(pub const $field: usize = __Fields::$field as usize;)* } - $vis enum Error<'ctx, M: 'ctx, E: $crate::effect::Effect> { - $($field(<<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::BuilderTypes>::Error)),* + $vis enum Error<'ctx, M: 'ctx, E: effectful::environment::Environment> { + $($field(<<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::BuilderTypes<E>>::Error)),* } + unsafe impl<'ctx, M: 'ctx, E: effectful::environment::Environment> effectful::bound::IsSend<E::NeedSend> for Error<'ctx, M, E> {} + unsafe impl<'ctx, M: 'ctx, E: effectful::environment::Environment> effectful::bound::IsSync<E::NeedSync> for Error<'ctx, M, E> {} + impl ::core::fmt::Display for Field { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { f.write_str(match self { @@ -42,7 +53,7 @@ macro_rules! Build { } } - impl<'ctx, M: 'ctx, E: $crate::effect::Effect> ::core::fmt::Debug for Error<'ctx, M, E> { + impl<'ctx, M: 'ctx, E: effectful::environment::Environment> ::core::fmt::Debug for Error<'ctx, M, E> { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { f.write_str(match self { $(Error::$field(_) => stringify!($field)),* @@ -50,7 +61,7 @@ macro_rules! Build { } } - impl<'ctx, M: 'ctx, E: $crate::effect::Effect> ::core::fmt::Display for Error<'ctx, M, E> { + impl<'ctx, M: 'ctx, E: effectful::environment::Environment> ::core::fmt::Display for Error<'ctx, M, E> { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { f.write_str(match self { $(Error::$field(_) => stringify!($field)),* @@ -60,12 +71,15 @@ macro_rules! Build { $vis struct __Info; - impl<'ctx, M: 'ctx, E: $crate::effect::Effect> $crate::builders::core::r#struct::StructTypeInfo<'ctx, M, E> for __Info { + impl<'ctx, M: 'ctx, E: effectful::environment::Environment> $crate::builders::core::r#struct::StructTypeInfo<'ctx, M, E> for __Info + where + $name: effectful::environment::DynBind<E> + { type Builders = Builders<'ctx, M, E>; type FieldMarker = Field; type T = $name; type Error = Error<'ctx, M, E>; - type Seed = ($(<<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::BuilderTypes>::Seed),*); + type Seed = ($(<<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::BuilderTypes<E>>::Seed),*); type ValueT = $crate::any::OwnedStatic<$name>; const FIELD_COUNT: usize = { @@ -73,40 +87,41 @@ macro_rules! Build { }; #[inline(always)] - fn new_builders<'a>(seed: Self::Seed) -> $crate::effect::ErasedEffective<'a, Self::Builders, E> { + fn new_builders<'a>(seed: Self::Seed) -> effectful::environment::NativeForm<'a, Self::Builders, E> { let ($($field),*) = seed; - use $crate::effect::EffectiveExt; + todo!() - $crate::effect::join( - ($(<<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::Builder::<E>>::from_seed($field),)*) - ).map(|($($field,)*)| { - Builders { - $($field),* - } - }) + // $crate::effect::join( + // ($(<<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::Builder::<E>>::from_seed($field),)*) + // ).map(|($($field,)*)| { + // Builders { + // $($field),* + // } + // }) } - fn from_builders<'a>(builders: Self::Builders) -> $crate::effect::ErasedEffective<'a, Result<Self::T, Self::Error>, E> { + fn from_builders<'a>(builders: Self::Builders) -> effectful::environment::NativeForm<'a, Result<Self::T, Self::Error>, E> { use $crate::Builder; - use $crate::effect::EffectiveExt; - - $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) - }) + + 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) + // }) } fn as_visitor<'a>( marker: Self::FieldMarker, builders: &'a mut Self::Builders, - ) -> $crate::protocol::DynVisitor<'a, 'ctx> { + ) -> $crate::protocol::DynVisitor<'a, 'ctx, E> { use $crate::protocol::AsVisitor; match marker { |