genies_derive 1.8.0

A powerful derive macro for configuration management in Rust
Documentation
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;
}

/// 对feignhttp 请求进行包装,自动获取jwt token。当jwt token 失效时,会自动更新
#[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;
}
/// 功能和Config 一样,用于框架内部使用,防止组件循环依赖
#[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;
}

/// 用casbin实现动态字段授权
/// 在定义时 #[casbin] 需要放在最前边
#[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
}