diff options
author | Alexander van Ratingen <470642+alvra@users.noreply.github.com> | 2022-04-21 22:16:02 +0200 |
---|---|---|
committer | Alexander van Ratingen <470642+alvra@users.noreply.github.com> | 2022-04-21 22:16:02 +0200 |
commit | 645d3f8d22136d58d65f034fc15ea748d751eb96 (patch) | |
tree | bf55549077f17e9167194f6cb21fed41ec30ba03 /derive-macro/src/lib.rs | |
download | generate-random-645d3f8d22136d58d65f034fc15ea748d751eb96.tar.xz |
Initial commit
Diffstat (limited to 'derive-macro/src/lib.rs')
-rw-r--r-- | derive-macro/src/lib.rs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/derive-macro/src/lib.rs b/derive-macro/src/lib.rs new file mode 100644 index 0000000..9aa93f5 --- /dev/null +++ b/derive-macro/src/lib.rs @@ -0,0 +1,46 @@ +//! This crate provide the [`GenerateRandom`] derive macro +//! that implements the trait of the same name from the `generate-random` crate. +//! Refer to the documentation of that crate for more information. + +use syn::{DeriveInput, Data, Fields}; + +mod handle_struct; +mod handle_enum; + +#[proc_macro_derive(GenerateRandom, attributes(weight))] +pub fn derive_generate_random(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + let input: DeriveInput = syn::parse(input).unwrap(); + match input.data { + Data::Struct(ty) => handle_struct::generate(&input.ident, ty), + Data::Enum(ty) => handle_enum::generate(&input.ident, ty), + Data::Union(_) => panic!("Unions are not supported"), + }.into() +} + +fn generate_fields(fields: Fields) -> proc_macro2::TokenStream { + use quote::quote; + match fields { + Fields::Named(fields) => { + let fields = fields.named.into_iter() + .map(|field| { + let field = field.ident.unwrap(); + quote! { + #field: generate_random::GenerateRandom::generate_random(rng), + } + }) + .collect::<proc_macro2::TokenStream>(); + quote! { { #fields } } + } + Fields::Unnamed(fields) => { + let fields = fields.unnamed.into_iter() + .map(|_field| { + quote! { + generate_random::GenerateRandom::generate_random(rng), + } + }) + .collect::<proc_macro2::TokenStream>(); + quote! { ( #fields ) } + } + Fields::Unit => quote! {}, + } +} |