Skip to main content

vesperi_derive/
lib.rs

1#![recursion_limit = "128"]
2
3use aggregate::derive_aggregate_for_struct;
4use command::derive_command_for_enum;
5use event::{derive_event_for_enum, derive_event_metadata_for_struct};
6use proc_macro::TokenStream;
7use query::derive_query_for_enum;
8use syn::{parse_macro_input, Data, DeriveInput};
9
10mod aggregate;
11mod command;
12mod event;
13mod helpers;
14mod query;
15
16#[proc_macro_derive(EventMetadata, attributes(event_type, event_version, event_id))]
17pub fn derive_event_metadata(input: TokenStream) -> TokenStream {
18    let ast = parse_macro_input!(input as DeriveInput);
19    // eprintln!("{:#?}", ast);
20
21    match ast.data {
22        Data::Struct(ref struct_data) => derive_event_metadata_for_struct(&ast, struct_data),
23        _ => panic!("#[derive(EventMetadata)] is only defined for struct types, but not enum or union types")
24    }
25}
26
27#[proc_macro_derive(Event)]
28pub fn derive_event(input: TokenStream) -> TokenStream {
29    let ast = parse_macro_input!(input as DeriveInput);
30    // eprintln!("{:#?}", ast);
31
32    match ast.data {
33        Data::Enum(ref enum_data) => derive_event_for_enum(&ast, enum_data),
34        _ => {
35            panic!("#[derive(Event)] is only defined for enum types, but not struct or union types")
36        }
37    }
38}
39
40#[proc_macro_derive(Command)]
41pub fn derive_command(input: TokenStream) -> TokenStream {
42    let ast = parse_macro_input!(input as DeriveInput);
43    // eprintln!("{:#?}", ast);
44
45    match ast.data {
46        Data::Enum(ref enum_data) => derive_command_for_enum(&ast, enum_data),
47        _ => {
48            panic!(
49                "#[derive(Command)] is only defined for enum types, but not struct or union types"
50            )
51        }
52    }
53}
54
55#[proc_macro_derive(Query)]
56pub fn derive_query(input: TokenStream) -> TokenStream {
57    let ast = parse_macro_input!(input as DeriveInput);
58    // eprintln!("{:#?}", ast);
59
60    match ast.data {
61        Data::Enum(ref enum_data) => derive_query_for_enum(&ast, enum_data),
62        _ => {
63            panic!("#[derive(Query)] is only defined for enum types, but not struct or union types")
64        }
65    }
66}
67
68#[proc_macro_derive(Aggregate, attributes(aggregate_type, aggregate_id, event_type))]
69pub fn derive_aggregate_metadata(input: TokenStream) -> TokenStream {
70    let ast = parse_macro_input!(input as DeriveInput);
71    // eprintln!("{:#?}", ast);
72
73    match ast.data {
74        Data::Struct(ref struct_data) => derive_aggregate_for_struct(&ast, struct_data),
75        _ => panic!(
76            "#[derive(Aggregate)] is only defined for struct types, but not enum or union types"
77        ),
78    }
79}