From 645d3f8d22136d58d65f034fc15ea748d751eb96 Mon Sep 17 00:00:00 2001 From: Alexander van Ratingen <470642+alvra@users.noreply.github.com> Date: Thu, 21 Apr 2022 22:16:02 +0200 Subject: Initial commit --- derive-macro/src/lib.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 derive-macro/src/lib.rs (limited to 'derive-macro/src/lib.rs') 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::(); + quote! { { #fields } } + } + Fields::Unnamed(fields) => { + let fields = fields.unnamed.into_iter() + .map(|_field| { + quote! { + generate_random::GenerateRandom::generate_random(rng), + } + }) + .collect::(); + quote! { ( #fields ) } + } + Fields::Unit => quote! {}, + } +} -- cgit v1.2.3