]> git.lizzy.rs Git - generate-random.git/blob - derive-macro/src/lib.rs
Initial commit
[generate-random.git] / derive-macro / src / lib.rs
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.
4
5 use syn::{DeriveInput, Data, Fields};
6
7 mod handle_struct;
8 mod handle_enum;
9
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();
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
20 fn 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 }