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::{Data, DeriveInput, 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"),
21 fn generate_fields(fields: Fields) -> proc_macro2::TokenStream {
24 Fields::Named(fields) => {
29 let field = field.ident.unwrap();
31 #field: generate_random::GenerateRandom::generate_random(rng),
34 .collect::<proc_macro2::TokenStream>();
35 quote! { { #fields } }
37 Fields::Unnamed(fields) => {
43 generate_random::GenerateRandom::generate_random(rng),
46 .collect::<proc_macro2::TokenStream>();
47 quote! { ( #fields ) }
49 Fields::Unit => quote! {},