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.";
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.