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 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 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 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 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 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}