usecrate::utils::{DeriveType, HashMap}; usecrate::utils::{SingleFieldData, State}; use proc_macro2::TokenStream; use quote::quote; use syn::{parse::Result, DeriveInput};
/// Provides the hook to expand `#[derive(FromStr)]` into an implementation of `FromStr` pubfn expand(input: &DeriveInput, trait_name: &'static str) -> Result<TokenStream> { let state = State::new(input, trait_name, trait_name.to_lowercase())?;
pubfn struct_from(state: &State, trait_name: &'static str) -> TokenStream { // We cannot set defaults for fields, once we do we can remove this check if state.fields.len() != 1 || state.enabled_fields().len() != 1 {
panic_one_field(trait_name);
}
let single_field_data = state.assert_single_enabled_field(); let SingleFieldData {
input_type,
field_type,
trait_path,
casted_trait,
impl_generics,
ty_generics,
where_clause,
..
} = single_field_data.clone();
let initializers = [quote! { #casted_trait::from_str(src)? }]; let body = single_field_data.initializer(&initializers);
quote! { #[automatically_derived] impl#impl_generics#trait_pathfor#input_type#ty_generics#where_clause { type Err = <#field_typeas#trait_path>::Err;
let input_type = &input.ident; let input_type_name = input_type.to_string();
letmut cases = vec![];
// if a case insensitive match is unique match do that // otherwise do a case sensitive match for (ref canonical, ref variants) in variants_caseinsensitive { if variants.len() == 1 { let variant = &variants[0];
cases.push(quote! { #canonical => #input_type::#variant,
})
} else { for variant in variants { let variant_str = variant.to_string();
cases.push(quote! { #canonicalif(src == #variant_str) => #input_type::#variant,
})
}
}
}
let trait_path = state.trait_path;
quote! { impl#trait_pathfor#input_type { type Err = ::derive_more::FromStrError;
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.