Diffstat (limited to 'src/macros/build.rs')
| -rw-r--r-- | src/macros/build.rs | 87 |
1 files changed, 34 insertions, 53 deletions
diff --git a/src/macros/build.rs b/src/macros/build.rs index b990f08..518cf41 100644 --- a/src/macros/build.rs +++ b/src/macros/build.rs @@ -1,5 +1,3 @@ -use crate::{effect::blocking::Blocking, transform, DefaultMode}; - #[macro_export] macro_rules! Build { { @@ -9,8 +7,8 @@ macro_rules! Build { ),* $(,)?} } => { const _: () = { - impl<'ctx, M, E: $crate::effect::Effect> $crate::Build<'ctx, M, E> for $name { - type Builder = $crate::builders::core::r#struct::StructBuilder<'ctx, Info, M, E>; + impl<'ctx, M: 'ctx, E: $crate::effect::Effect> $crate::Build<'ctx, M, E> for $name { + type Builder = $crate::builders::core::r#struct::StructBuilder<'ctx, __Info, M, E>; } $vis struct Builders<'ctx, M, E: $crate::effect::Effect> { @@ -35,17 +33,38 @@ macro_rules! Build { $($field(<$type as $crate::BuilderTypes>::Error)),* } - $vis struct Info; + impl ::core::fmt::Display for Field { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + f.write_str(match self { + $(Field::$field => stringify!($field)),* + }) + } + } + + impl ::core::fmt::Display for Error { + fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result { + f.write_str(match self { + $(Error::$field(_) => stringify!($field)),* + }) + } + } + + $vis struct __Info; - impl<'ctx, M, E: $crate::effect::Effect> $crate::builders::core::r#struct::StructTypeInfo<'ctx, M, E> for Info { - type Builders = Builders<'ctx, M, E>; + impl<'ctx, M: 'ctx> $crate::builders::core::r#struct::StructTypeInfo<'ctx, M> for __Info { + type Builders<E: $crate::effect::Effect> = Builders<'ctx, M, E>; type FieldMarker = Field; type T = $name; type Error = Error; type Seed = ($(<$type as $crate::BuilderTypes>::Seed),*); + type ValueT = $crate::any::OwnedStatic<$name>; + + const FIELD_COUNT: usize = { + [$(stringify!($field)),*].len() + }; #[inline(always)] - fn new_builders<'a>(seed: Self::Seed) -> $crate::effect::ErasedEffective<'a, Self::Builders, E> { + fn new_builders<'a, E: $crate::effect::Effect>(seed: Self::Seed) -> $crate::effect::ErasedEffective<'a, Self::Builders<E>, E> { let ($($field),*) = seed; use $crate::effect::EffectiveExt; @@ -57,15 +76,9 @@ macro_rules! Build { $($field),* } }) - - // E::wrap(async move { - // Builders { - // $($field: $crate::Builder::<E>::from_seed($field).await),* - // } - // }) } - fn from_builders<'a>(builders: Self::Builders) -> $crate::effect::ErasedEffective<'a, Result<Self::T, Self::Error>, E> { + fn from_builders<'a, E: $crate::effect::Effect>(builders: Self::Builders<E>) -> $crate::effect::ErasedEffective<'a, Result<Self::T, Self::Error>, E> { use $crate::Builder; use $crate::effect::EffectiveExt; @@ -79,17 +92,11 @@ macro_rules! Build { }), Err(err) => Err(err) }) - - // E::wrap(async { - // Ok($name { - // $($field: builders.$field.build().await.map_err(Error::$field)?),* - // }) - // }) } - fn as_visitor<'a>( + fn as_visitor<'a, E: $crate::effect::Effect>( marker: Self::FieldMarker, - builders: &'a mut Self::Builders, + builders: &'a mut Self::Builders<E>, ) -> $crate::protocol::DynVisitor<'a, 'ctx> { use $crate::Builder; @@ -111,37 +118,11 @@ macro_rules! Build { _ => None } } + + fn from_value(value: Self::ValueT) -> Self::T { + value.0 + } } }; } } - -#[test] -fn demo() { - use crate::Walk; - use macro_rules_attribute::derive; - - #[derive(Build!, Walk!, Debug)] - struct X { - a: bool, - b: bool, - } - - #[derive(Build!, Walk!, Debug)] - struct Y { - b: bool, - a: bool, - } - - let value = X { a: true, b: false }; - - let other = transform::<<Y as crate::Build<'_, DefaultMode, _>>::Builder, _, Blocking>( - ((), ()), - Walk::<DefaultMode, _>::into_walker(&value), - ) - .value(); - - dbg!(other); - - // todo!(); -} |