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