usecrate::utils::{AttrParams, DeriveType, State}; use convert_case::{Case, Casing}; use proc_macro2::TokenStream; use quote::{format_ident, quote}; use syn::{DeriveInput, Fields, Ident, Result, Type};
pubfn expand(input: &DeriveInput, trait_name: &'static str) -> Result<TokenStream> { let state = State::with_attr_params(
input,
trait_name, "unwrap".into(),
AttrParams {
enum_: vec!["ignore", "owned", "ref", "ref_mut"],
variant: vec!["ignore", "owned", "ref", "ref_mut"],
struct_: vec!["ignore"],
field: vec!["ignore"],
},
)?;
assert!(
state.derive_type == DeriveType::Enum, "Unwrap can only be derived for enums",
);
let enum_name = &input.ident; let (imp_generics, type_generics, where_clause) = input.generics.split_for_impl();
let variant_data = state.enabled_variant_data();
letmut funcs = vec![]; for (variant_state, info) in
Iterator::zip(variant_data.variant_states.iter(), variant_data.infos)
{ let variant = variant_state.variant.unwrap(); let fn_name = format_ident!( "unwrap_{ident}",
ident = variant.ident.to_string().to_case(Case::Snake),
span = variant.ident.span(),
); let ref_fn_name = format_ident!( "unwrap_{ident}_ref",
ident = variant.ident.to_string().to_case(Case::Snake),
span = variant.ident.span(),
); let mut_fn_name = format_ident!( "unwrap_{ident}_mut",
ident = variant.ident.to_string().to_case(Case::Snake),
span = variant.ident.span(),
); let variant_ident = &variant.ident; let (data_pattern, ret_value, data_types) = get_field_info(&variant.fields); let pattern = quote! { #enum_name :: #variant_ident#data_pattern };
let doc_owned = format!( "Unwraps this value to the `{enum_name}::{variant_ident}` variant.\n",
); let doc_ref = format!( "Unwraps this reference to the `{enum_name}::{variant_ident}` variant.\n",
); let doc_mut = format!( "Unwraps this mutable reference to the `{enum_name}::{variant_ident}` variant.\n",
); let doc_else = "Panics if this value is of any other type.";
fn failed_block(state: &State, enum_name: &Ident, fn_name: &Ident) -> TokenStream { let arms = state
.variant_states
.iter()
.map(|it| it.variant.unwrap())
.map(|variant| { let data_pattern = match variant.fields {
Fields::Named(_) => quote! { {..} },
Fields::Unnamed(_) => quote! { (..) },
Fields::Unit => quote! {},
}; let variant_ident = &variant.ident; let panic_msg = format!( "called `{enum_name}::{fn_name}()` on a `{enum_name}::{variant_ident}` value"
);
quote! { #enum_name :: #variant_ident#data_pattern => panic!(#panic_msg) }
});
quote! { match val { #(#arms),*
}
}
}
Messung V0.5 in Prozent
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.10Angebot
(Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können 2026-09-30)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.