aboutsummaryrefslogtreecommitdiff
path: root/derive-macro/src/lib.rs
diff options
context:
space:
mode:
authorAlexander van Ratingen <470642+alvra@users.noreply.github.com>2022-04-21 22:16:02 +0200
committerAlexander van Ratingen <470642+alvra@users.noreply.github.com>2022-04-21 22:16:02 +0200
commit645d3f8d22136d58d65f034fc15ea748d751eb96 (patch)
treebf55549077f17e9167194f6cb21fed41ec30ba03 /derive-macro/src/lib.rs
downloadgenerate-random-645d3f8d22136d58d65f034fc15ea748d751eb96.tar.xz
Initial commit
Diffstat (limited to 'derive-macro/src/lib.rs')
-rw-r--r--derive-macro/src/lib.rs46
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! {},
+ }
+}