1 //! This crate provide the [`GenerateRandom`] derive macro
2 //! that implements the trait of the same name from the `generate-random` crate.
3 //! Refer to the documentation of that crate for more information.
5 use syn::{DeriveInput, Data, Fields};
10 #[proc_macro_derive(GenerateRandom, attributes(weight))]
11 pub fn derive_generate_random(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
12 let input: DeriveInput = syn::parse(input).unwrap();
14 Data::Struct(ty) => handle_struct::generate(&input.ident, ty),
15 Data::Enum(ty) => handle_enum::generate(&input.ident, ty),
16 Data::Union(_) => panic!("Unions are not supported"),
20 fn generate_fields(fields: Fields) -> proc_macro2::TokenStream {
23 Fields::Named(fields) => {
24 let fields = fields.named.into_iter()
26 let field = field.ident.unwrap();
28 #field: generate_random::GenerateRandom::generate_random(rng),
31 .collect::<proc_macro2::TokenStream>();
32 quote! { { #fields } }
34 Fields::Unnamed(fields) => {
35 let fields = fields.unnamed.into_iter()
38 generate_random::GenerateRandom::generate_random(rng),
41 .collect::<proc_macro2::TokenStream>();
42 quote! { ( #fields ) }
44 Fields::Unit => quote! {},