Diffstat (limited to 'src/macros/build.rs')
| -rw-r--r-- | src/macros/build.rs | 116 |
1 files changed, 74 insertions, 42 deletions
diff --git a/src/macros/build.rs b/src/macros/build.rs index c77426d..14e4443 100644 --- a/src/macros/build.rs +++ b/src/macros/build.rs @@ -9,20 +9,23 @@ 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: effectful::environment::Environment> $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> + effectful::bound::Dynamic<$name>: effectful::environment::DynBind<E>, + $($type: $crate::Build<'ctx, M, E>,)* + $crate::builders::core::r#struct::StructBuilder<'ctx, __Info, M, E>: $crate::Builder<'ctx, E, Value = Self> { type Builder = $crate::builders::core::r#struct::StructBuilder<'ctx, __Info, M, E>; } - $vis struct Builders<'ctx, M: 'ctx, E: effectful::environment::Environment> { + #[derive(SendSync)] + $vis struct Builders<'ctx, M: 'ctx, E: effectful::environment::Environment> + where + $($type: $crate::Build<'ctx, M, E>),* + { $($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, SendSync)] $vis enum Field { $($field),* @@ -36,13 +39,14 @@ macro_rules! Build { $(pub const $field: usize = __Fields::$field as usize;)* } - $vis enum Error<'ctx, M: 'ctx, E: effectful::environment::Environment> { + #[derive(SendSync)] + $vis enum Error<'ctx, M: 'ctx, E: effectful::environment::Environment> + where + $($type: $crate::Build<'ctx, M, E>),* + { $($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 { @@ -51,7 +55,10 @@ macro_rules! Build { } } - impl<'ctx, M: 'ctx, E: effectful::environment::Environment> ::core::fmt::Debug for Error<'ctx, M, E> { + impl<'ctx, M: 'ctx, E: effectful::environment::Environment> ::core::fmt::Debug for Error<'ctx, M, E> + where + $($type: $crate::Build<'ctx, M, E>),* + { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { f.write_str(match self { $(Error::$field(_) => stringify!($field)),* @@ -59,7 +66,10 @@ macro_rules! Build { } } - impl<'ctx, M: 'ctx, E: effectful::environment::Environment> ::core::fmt::Display for Error<'ctx, M, E> { + impl<'ctx, M: 'ctx, E: effectful::environment::Environment> ::core::fmt::Display for Error<'ctx, M, E> + where + $($type: $crate::Build<'ctx, M, E>),* + { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { f.write_str(match self { $(Error::$field(_) => stringify!($field)),* @@ -67,18 +77,20 @@ macro_rules! Build { } } + #[derive(SendSync)] $vis struct __Info; - impl<'ctx, M: 'ctx, E: effectful::environment::Environment> $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> + effectful::bound::Dynamic<$name>: effectful::environment::DynBind<E>, + $($type: $crate::Build<'ctx, M, 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<E>>::Seed),*); - type ValueT = $crate::any::OwnedStatic<$name>; + type ValueT = $crate::any::OwnedStatic<effectful::bound::Dynamic<$name>>; const FIELD_COUNT: usize = { [$(stringify!($field)),*].len() @@ -99,7 +111,7 @@ macro_rules! Build { // }) } - fn from_builders<'a>(builders: Self::Builders) -> effectful::environment::NativeForm<'a, Result<Self::T, Self::Error>, E> { + fn from_builders<'a>(builders: Self::Builders) -> effectful::environment::NativeForm<'a, Result<effectful::bound::Dynamic<Self::T>, Self::Error>, E> { use $crate::Builder; todo!() @@ -142,7 +154,7 @@ macro_rules! Build { } fn from_value(value: Self::ValueT) -> Self::T { - value.0 + value.0.0 } } }; @@ -156,27 +168,32 @@ 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: effectful::environment::Environment> $crate::Build<'ctx, M, E> for $name { + impl<'ctx, M: 'ctx, E: effectful::environment::Environment> $crate::Build<'ctx, M, E> for $name + where + effectful::bound::Dynamic<$name>: effectful::environment::DynBind<E>, + $($value: $crate::Build<'ctx, M, E>,)* + $(<<$value as Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::Seed: Default,)* + $crate::builders::core::r#enum::EnumBuilder<'ctx, __Info, M, E>: $crate::Builder<'ctx, E, Value = Self> + { type Builder = $crate::builders::core::r#enum::EnumBuilder<'ctx, __Info, M, E>; } + #[derive(SendSync)] $vis struct __Info; - $vis enum __Builders<'ctx, M, E: effectful::environment::Environment> { + #[derive(SendSync)] + $vis enum __Builders<'ctx, M, E: effectful::environment::Environment> + where + $($value: $crate::Build<'ctx, M, E>),* + { $($variant(<$value 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)] + #[derive(Copy, Clone, SendSync)] $vis enum __Marker { $($variant),* } - unsafe impl<'ctx, F: effectful::bound::Bool> effectful::bound::IsSend<F> for __Marker {} - unsafe impl<'ctx, F: effectful::bound::Bool> effectful::bound::IsSync<F> for __Marker {} - impl ::core::fmt::Display for __Marker { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { f.write_str(match self { @@ -193,24 +210,29 @@ macro_rules! Build { $(pub const $variant: u32 = __Variants::$variant as u32;)* } - $vis struct __ErrorBuilder<'ctx, M, E: Environment> { + #[derive(SendSync)] + $vis struct __ErrorBuilder<'ctx, M, E: Environment> + where + $($value: $crate::Build<'ctx, M, E>),* + { $($variant: Option<<<$value as $crate::Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::Error>),* } - unsafe impl<'ctx, M: 'ctx, E: effectful::environment::Environment> effectful::bound::IsSend<E::NeedSend> for __ErrorBuilder<'ctx, M, E> {} - unsafe impl<'ctx, M: 'ctx, E: effectful::environment::Environment> effectful::bound::IsSync<E::NeedSync> for __ErrorBuilder<'ctx, M, E> {} - - $vis enum __Error<'ctx, M, E: Environment> { + #[derive(SendSync)] + $vis enum __Error<'ctx, M, E: Environment> + where + $($value: $crate::Build<'ctx, M, E>),* + { __Guess { $($variant: <<$value as $crate::Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::Error),* }, $($variant(<<$value as $crate::Build<'ctx, M, E>>::Builder as 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<'ctx, M, E: Environment> ::core::fmt::Display for __Error<'ctx, M, E> { + impl<'ctx, M, E: Environment> ::core::fmt::Display for __Error<'ctx, M, E> + where + $($value: $crate::Build<'ctx, M, E>),* + { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { Self::__Guess { @@ -225,7 +247,10 @@ macro_rules! Build { } } - impl<'ctx, M, E: Environment> ::core::fmt::Debug for __Error<'ctx, M, E> { + impl<'ctx, M, E: Environment> ::core::fmt::Debug for __Error<'ctx, M, E> + where + $($value: $crate::Build<'ctx, M, E>),* + { fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { match self { Self::__Guess { @@ -240,7 +265,12 @@ macro_rules! Build { } } - impl<'ctx, M: 'ctx, E: effectful::environment::Environment> $crate::builders::core::r#enum::EnumBuildInfo<'ctx, M, E> for __Info { + impl<'ctx, M: 'ctx, E: effectful::environment::Environment> $crate::builders::core::r#enum::EnumBuildInfo<'ctx, M, E> for __Info + where + effectful::bound::Dynamic<$name>: effectful::environment::DynBind<E>, + $($value: $crate::Build<'ctx, M, E>,)* + $(<<$value as Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::Seed: Default),* + { type Builders = __Builders<'ctx, M, E>; type Seed = (); @@ -266,9 +296,9 @@ macro_rules! Build { fn finish_builder<'a>( builder: Self::Builders, - ) -> NativeForm<'a, Result<Self::T, Self::Error>, E> { + ) -> NativeForm<'a, Result<effectful::bound::Dynamic<Self::T>, Self::Error>, E> { match builder { - $(__Builders::$variant(builder) => builder.build().map((), |_, value| value.map($name::$variant).map_err(__Error::$variant)).cast()),* + $(__Builders::$variant(builder) => builder.build().map((), |_, value| value.map(|x| effectful::bound::Dynamic($name::$variant(<<$value as Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::unwrap_output(x)))).map_err(__Error::$variant)).cast()),* } } @@ -299,20 +329,22 @@ macro_rules! Build { fn guess_variant<'a>( seed: Self::Seed, scope: DynRecoverableScope<'a, 'ctx, E>, - ) -> NativeForm<'a, Result<Self::T, Self::Error>, E> { + ) -> NativeForm<'a, Result<effectful::bound::Dynamic<Self::T>, Self::Error>, E> { use effectful::effective::EffectiveExt; use effectful::short::ResultErrorExt; E::value((scope, Err(__ErrorBuilder::<M, E> { A: None, B: None }))) $(.or_else_update((), |_, scope, result| { let mut error = result.into_error(); - + <<$value as Build<M, E>>::Builder as Builder<_>>::from_seed(Default::default()) .map(scope, |scope, builder| (scope, builder)) .update((), |(), (scope, builder)| scope.new_walk(builder.as_visitor()).cast()) .then((), |(), ((_, builder), _)| builder.build()) .map(error, |mut error, result| { - result.map(X::$variant).map_err(|err| { + result.map(|x| effectful::bound::Dynamic(X::$variant( + <<$value as Build<'ctx, M, E>>::Builder as BuilderTypes<E>>::unwrap_output(x) + ))).map_err(|err| { error.$variant = Some(err); error }) |