generate_random_macro/
lib.rs1use syn::{DeriveInput, Data, Fields};
6
7mod handle_struct;
8mod handle_enum;
9
10#[proc_macro_derive(GenerateRandom, attributes(weight))]
11pub fn derive_generate_random(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
12 let input: DeriveInput = syn::parse(input).unwrap();
13 match input.data {
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"),
17 }.into()
18}
19
20fn generate_fields(fields: Fields) -> proc_macro2::TokenStream {
21 use quote::quote;
22 match fields {
23 Fields::Named(fields) => {
24 let fields = fields.named.into_iter()
25 .map(|field| {
26 let field = field.ident.unwrap();
27 quote! {
28 #field: generate_random::GenerateRandom::generate_random(rng),
29 }
30 })
31 .collect::<proc_macro2::TokenStream>();
32 quote! { { #fields } }
33 }
34 Fields::Unnamed(fields) => {
35 let fields = fields.unnamed.into_iter()
36 .map(|_field| {
37 quote! {
38 generate_random::GenerateRandom::generate_random(rng),
39 }
40 })
41 .collect::<proc_macro2::TokenStream>();
42 quote! { ( #fields ) }
43 }
44 Fields::Unit => quote! {},
45 }
46}