Diffstat (limited to 'src/macros/build.rs')
| -rw-r--r-- | src/macros/build.rs | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/src/macros/build.rs b/src/macros/build.rs index 9511465..9e7ced9 100644 --- a/src/macros/build.rs +++ b/src/macros/build.rs @@ -12,7 +12,7 @@ macro_rules! Build { type Builder = $crate::builders::core::r#struct::StructBuilder<'ctx, __Info, M, E>; } - $vis struct Builders<'ctx, M, E: $crate::effect::Effect> { + $vis struct Builders<'ctx, M: 'ctx, E: $crate::effect::Effect> { $($field: <$type as $crate::Build<'ctx, M, E>>::Builder),* } @@ -29,9 +29,8 @@ macro_rules! Build { $(pub const $field: usize = __Fields::$field as usize;)* } - #[derive(Debug)] - $vis enum Error { - $($field(<$type as $crate::BuilderTypes>::Error)),* + $vis enum Error<'ctx, M: 'ctx, E: $crate::effect::Effect> { + $($field(<<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::BuilderTypes>::Error)),* } impl ::core::fmt::Display for Field { @@ -42,7 +41,15 @@ macro_rules! Build { } } - impl ::core::fmt::Display for Error { + impl<'ctx, M: 'ctx, E: $crate::effect::Effect> ::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)),* + }) + } + } + + impl<'ctx, M: 'ctx, E: $crate::effect::Effect> ::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)),* @@ -52,12 +59,12 @@ macro_rules! Build { $vis struct __Info; - impl<'ctx, M: 'ctx> $crate::builders::core::r#struct::StructTypeInfo<'ctx, M> for __Info { - type Builders<E: $crate::effect::Effect> = Builders<'ctx, M, E>; + impl<'ctx, M: 'ctx, E: $crate::effect::Effect> $crate::builders::core::r#struct::StructTypeInfo<'ctx, M, E> for __Info { + type Builders = Builders<'ctx, M, E>; type FieldMarker = Field; type T = $name; - type Error = Error; - type Seed = ($(<$type as $crate::BuilderTypes>::Seed),*); + type Error = Error<'ctx, M, E>; + type Seed = ($(<<$type as $crate::Build<'ctx, M, E>>::Builder as $crate::BuilderTypes>::Seed),*); type ValueT = $crate::any::OwnedStatic<$name>; const FIELD_COUNT: usize = { @@ -65,7 +72,7 @@ macro_rules! Build { }; #[inline(always)] - fn new_builders<'a, E: $crate::effect::Effect>(seed: Self::Seed) -> $crate::effect::ErasedEffective<'a, Self::Builders<E>, E> { + fn new_builders<'a>(seed: Self::Seed) -> $crate::effect::ErasedEffective<'a, Self::Builders, E> { let ($($field),*) = seed; use $crate::effect::EffectiveExt; @@ -79,7 +86,7 @@ macro_rules! Build { }) } - fn from_builders<'a, E: $crate::effect::Effect>(builders: Self::Builders<E>) -> $crate::effect::ErasedEffective<'a, Result<Self::T, Self::Error>, E> { + fn from_builders<'a>(builders: Self::Builders) -> $crate::effect::ErasedEffective<'a, Result<Self::T, Self::Error>, E> { use $crate::Builder; use $crate::effect::EffectiveExt; @@ -95,9 +102,9 @@ macro_rules! Build { }) } - fn as_visitor<'a, E: $crate::effect::Effect>( + fn as_visitor<'a>( marker: Self::FieldMarker, - builders: &'a mut Self::Builders<E>, + builders: &'a mut Self::Builders, ) -> $crate::protocol::DynVisitor<'a, 'ctx> { use $crate::Builder; |