extern crate proc_macro;
mod aggregate_type;
mod casbin;
mod config_core_type;
mod config_shared;
mod config_type;
mod enu;
mod event_type;
mod helpers;
mod topic;
mod remote;
use proc_macro::TokenStream;
use crate::topic::*;
use syn::*;
use crate::aggregate_type::{
derive_aggregate_type_for_enum, derive_aggregate_type_for_struct,
derive_aggregate_type_for_union,
};
use crate::event_type::{
derive_event_type_for_enum, derive_event_type_for_struct, derive_event_type_for_union,
};
use crate::casbin::{impl_casbin};
use crate::config_core_type::derive_config_core_type_for_struct;
use crate::config_type::derive_config_type_for_struct;
use crate::remote::impl_remote;
#[proc_macro_derive(DomainEvent, attributes(event_type, event_type_version, event_source))]
pub fn derive_event_type(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
match ast.data {
Data::Enum(ref enum_data) => derive_event_type_for_enum(&ast, enum_data),
Data::Struct(ref struct_data) => derive_event_type_for_struct(&ast, struct_data),
Data::Union(ref union_data) => derive_event_type_for_union(&ast, union_data),
}
}
#[proc_macro_derive(
Aggregate,
attributes(aggregate_type, id_field, initialize_with_defaults)
)]
pub fn derive_aggregate_type(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
match ast.data {
Data::Enum(ref enum_data) => derive_aggregate_type_for_enum(&ast, enum_data),
Data::Struct(ref struct_data) => derive_aggregate_type_for_struct(&ast, struct_data),
Data::Union(ref union_data) => derive_aggregate_type_for_union(&ast, union_data),
}
}
#[proc_macro_attribute]
pub fn topic(args: TokenStream, func: TokenStream) -> TokenStream {
let args = parse_macro_input!(args as AttributeArgs);
let target_fn: ItemFn = syn::parse(func).unwrap();
let stream = impl_topic(&target_fn, &args);
#[cfg(feature = "debug_mode")]
if cfg!(debug_assertions) {
use rust_format::{Formatter, RustFmt};
let code = RustFmt::default().format_str(stream.to_string()).unwrap();
println!("............gen macro topic :\n {}", code);
println!("............gen macro topic end............");
}
return stream;
}
#[proc_macro_attribute]
pub fn remote(args: TokenStream, func: TokenStream) -> TokenStream {
let args = parse_macro_input!(args as AttributeArgs);
let target_fn: ItemFn = syn::parse(func).unwrap();
let stream = impl_remote(&target_fn, &args);
#[cfg(feature = "debug_mode")]
if cfg!(debug_assertions) {
use rust_format::{Formatter, RustFmt};
let code = RustFmt::default().format_str(stream.to_string()).unwrap();
println!("............gen macro remote :\n {}", code);
println!("............gen macro remote end............");
}
return stream;
}
#[proc_macro_derive(Config, attributes(config))]
pub fn derive_config(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
let stream = derive_config_type_for_struct(&ast);
#[cfg(feature = "debug_mode")]
if cfg!(debug_assertions) {
use rust_format::{Formatter, RustFmt};
let code = RustFmt::default().format_str(stream.to_string()).unwrap();
println!("............gen macro Config :\n {}", code);
println!("............gen macro Config end............");
}
return stream;
}
#[proc_macro_derive(ConfigCore, attributes(config))]
pub fn derive_config_core(input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
let stream = derive_config_core_type_for_struct(&ast);
#[cfg(feature = "debug_mode")]
if cfg!(debug_assertions) {
use rust_format::{Formatter, RustFmt};
let code = RustFmt::default().format_str(stream.to_string()).unwrap();
println!("............gen macro ConfigCore :\n {}", code);
println!("............gen macro ConfigCore end............");
}
return stream;
}
#[proc_macro_attribute]
pub fn casbin(_attr: TokenStream, item: TokenStream) -> TokenStream {
let mut input = parse_macro_input!(item as DeriveInput);
let stream = impl_casbin(&mut input);
#[cfg(feature = "debug_mode")]
if cfg!(debug_assertions) {
use rust_format::{Formatter, RustFmt};
let code = RustFmt::default().format_str(stream.to_string()).unwrap();
println!("............gen macro casbin :\n {}", code);
println!("............gen macro casbin end............");
}
stream
}