facet::define_attr_grammar! {
ns "error";
crate_path ::facet_error;
pub enum Attr {
From,
Source,
}
}
#[macro_export]
macro_rules! __facet_invoke {
(
@tokens { $($tokens:tt)* }
@remaining { $($remaining:tt)* }
@plugins { $($plugins:tt)* }
@facet_crate { $($facet_crate:tt)* }
) => {
$crate::__facet_invoke_internal! {
@tokens { $($tokens)* }
@remaining { $($remaining)* }
@plugins {
$($plugins)*
@plugin {
@name { "Error" }
@template {
impl ::core::fmt::Display for @Self {
#[allow(unused_variables)] fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
@for_variant {
Self::@variant_name @variant_pattern => {
write!(f, @format_doc_comment)
}
}
}
}
}
impl ::std::error::Error for @Self {
fn source(&self) -> Option<&(dyn ::std::error::Error + 'static)> {
match self {
@for_variant {
@if_field_attr(error::source) {
Self::@variant_name @variant_pattern_only(error::source) => {
Some(@field_expr)
}
}
@if_field_attr(error::from) {
Self::@variant_name @variant_pattern_only(error::from) => {
Some(@field_expr)
}
}
}
_ => None,
}
}
}
@for_variant {
@if_any_field_attr(error::from) {
@for_field {
@if_attr(error::from) {
impl ::core::convert::From<@field_type> for @Self {
fn from(source: @field_type) -> Self {
@if_struct_variant {
Self::@variant_name {
@field_name: source,
@for_field {
@if_attr(default) {
@field_name: @attr_args,
}
}
}
}
@if_tuple_variant {
Self::@variant_name(source)
}
}
}
}
}
}
}
}
}
}
@facet_crate { $($facet_crate)* }
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __facet_invoke_internal {
(
@tokens { $($tokens:tt)* }
@remaining { }
@plugins { $($plugins:tt)* }
@facet_crate { $($facet_crate:tt)* }
) => {
$($facet_crate)*::__facet_finalize! {
@tokens { $($tokens)* }
@plugins { $($plugins)* }
@facet_crate { $($facet_crate)* }
}
};
(
@tokens { $($tokens:tt)* }
@remaining { $next:path $(, $rest:path)* $(,)? }
@plugins { $($plugins:tt)* }
@facet_crate { $($facet_crate:tt)* }
) => {
$next! {
@tokens { $($tokens)* }
@remaining { $($rest),* }
@plugins { $($plugins)* }
@facet_crate { $($facet_crate)* }
}
};
}