random_constructible_derive/
lib.rs1#![allow(unused_imports)]
2extern crate proc_macro;
3
4#[macro_use] mod imports; use imports::*;
5
6xp!{derive_for_enum}
7xp!{derive_for_struct}
8xp!{derive_for_unit_struct}
9xp!{derive_for_struct_named_fields}
10xp!{derive_for_struct_unnamed_fields}
11xp!{parse}
12xp!{extract_from_meta_list}
13xp!{extract_from_attribute}
14xp!{extract_from_attributes}
15xp!{extract_enum_variants}
16xp!{generate_variant_constructors}
17xp!{generate_match_arms}
18xp!{generate_random_constructible_enum_impl}
19xp!{collect_variant_probs}
20xp!{check_primitive_field_type}
21xp!{variant_has_primitive_type}
22
23#[proc_macro_derive(RandConstructEnvironment)]
24pub fn derive_random_constructible_environment(input: TokenStream) -> TokenStream {
25
26 let input = parse_macro_input!(input as DeriveInput);
27 let name = input.ident;
28
29 TokenStream::from(quote!{
30 impl RandConstructEnvironment for #name {}
31 })
32}
33
34#[proc_macro_derive(RandConstruct, attributes(rand_construct))]
35pub fn derive_random_constructible(input: TokenStream) -> TokenStream {
36 let input_ast = parse_macro_input!(input as DeriveInput);
38
39 let expanded = match input_ast.data {
40 Data::Enum(_) => derive_random_constructible_for_enum(&input_ast),
41 Data::Struct(_) => derive_random_constructible_for_struct(&input_ast),
42 _ => panic!("RandConstruct can only be derived for enums and structs"),
43 };
44
45 expanded.into()
46}