random_constructible_derive/
lib.rs

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