macro_rules! define_errors {
(
$(#[$enum_meta:meta])*
$vis:vis enum $name:ident {
$(
#[error($msg:literal $(, level = $level:ident)? $(, target = $target:literal)? $(, source)?)]
$variant:ident $({
$(
$(#[$field_meta:meta])*
$field_name:ident: $field_type:ty
),* $(,)?
})?,
)*
}
) => { ... };
(
$first_name:ident {
$($first_tokens:tt)*
}
$($rest_name:ident {
$($rest_tokens:tt)*
})+
) => { ... };
(
$name:ident {
$($tokens:tt)*
}
) => { ... };
(@collect
name: $name:ident,
variants: [$($variants:tt)*],
tokens: [
$variant:ident { $($field_name:ident : $field_type:ty),* $(,)? } : $msg:literal $([$($attr:tt)*])?
$(, $($rest:tt)*)?
]
) => { ... };
(@collect
name: $name:ident,
variants: [$($variants:tt)*],
tokens: []
) => { ... };
(@build $name:ident; $(($variant:ident, $msg:literal, (), $([$($attr:tt)*])?))*) => { ... };
(@build $name:ident; $(($variant:ident, $msg:literal, ($($field_name:ident : $field_type:ty),+), $([$($attr:tt)*])?))*) => { ... };
(@build $name:ident; $(($variant:ident, $msg:literal, ($($field_name:ident : $field_type:ty),*), $([$($attr:tt)*])?))*) => { ... };
(@separate_mixed $name:ident;
unit_variants: [$($unit_processed:tt)*];
struct_variants: [$($struct_processed:tt)*];
remaining: [($variant:ident, $msg:literal, (), $([$($attr:tt)*])?) $($rest:tt)*]
) => { ... };
(@separate_mixed $name:ident;
unit_variants: [$($unit_processed:tt)*];
struct_variants: [$($struct_processed:tt)*];
remaining: [($variant:ident, $msg:literal, ($($field_name:ident : $field_type:ty),+), $([$($attr:tt)*])?) $($rest:tt)*]
) => { ... };
(@separate_mixed $name:ident;
unit_variants: [$(($unit_variant:ident, $unit_msg:literal, $([$($unit_attr:tt)*])?))*];
struct_variants: [$(($struct_variant:ident, $struct_msg:literal, ($($struct_field_name:ident : $struct_field_type:ty),+), $([$($struct_attr:tt)*])?))*];
remaining: []
) => { ... };
(@log_simple [$($attr:tt)*] ; $code:expr, $message:expr) => { ... };
(@log_simple ; $code:expr, $message:expr) => { ... };
(@log_with_attrs level = error, target = $target:literal ; $code:expr, $message:expr) => { ... };
(@log_with_attrs level = warn, target = $target:literal ; $code:expr, $message:expr) => { ... };
(@log_with_attrs level = info, target = $target:literal ; $code:expr, $message:expr) => { ... };
(@log_with_attrs level = debug, target = $target:literal ; $code:expr, $message:expr) => { ... };
(@log_with_attrs level = trace, target = $target:literal ; $code:expr, $message:expr) => { ... };
(@log_with_attrs level = error ; $code:expr, $message:expr) => { ... };
(@log_with_attrs level = warn ; $code:expr, $message:expr) => { ... };
(@log_with_attrs level = info ; $code:expr, $message:expr) => { ... };
(@log_with_attrs level = debug ; $code:expr, $message:expr) => { ... };
(@log_with_attrs level = trace ; $code:expr, $message:expr) => { ... };
(@log_with_attrs target = $target:literal ; $code:expr, $message:expr) => { ... };
(@log_with_attrs ; $code:expr, $message:expr) => { ... };
(@log_thiserror $level:ident $target:literal ; $code:expr, $message:expr) => { ... };
(@log_thiserror $level:ident ; $code:expr, $message:expr) => { ... };
(@log_thiserror $target:literal ; $code:expr, $message:expr) => { ... };
(@log_thiserror ; $code:expr, $message:expr) => { ... };
(@extract_thiserror_info $level:ident $target:literal ; $code:expr) => { ... };
(@extract_thiserror_info $level:ident ; $code:expr) => { ... };
(@extract_thiserror_info $target:literal ; $code:expr) => { ... };
(@extract_thiserror_info ; $code:expr) => { ... };
(@extract_info [level = $level:ident, target = $target:literal] ; $code:expr) => { ... };
(@extract_info [target = $target:literal, level = $level:ident] ; $code:expr) => { ... };
(@extract_info [level = $level:ident] ; $code:expr) => { ... };
(@extract_info [target = $target:literal] ; $code:expr) => { ... };
(@extract_info ; $code:expr) => { ... };
}Expand description
Enhanced define_errors! macro with structured tracing integration.
Supports both thiserror-style and simplified LogFusion-style syntax. See examples in the cookbook folder and comprehensive tests for usage patterns.