Diffstat (limited to 'src/macros/build.rs')
-rw-r--r--src/macros/build.rs87
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!();
-}