autoload/
lib.rs

1#![feature(core_intrinsics)]
2#![feature(proc_macro_span)]
3#![feature(proc_macro_def_site)]
4#[warn(unused_imports)]
5#[macro_use]
6extern crate singlemap;
7extern crate proc_macro;
8extern crate proc_macro2;
9extern crate once_cell;
10extern crate pest;
11extern crate quote;
12#[macro_use]
13extern crate pest_derive;
14extern crate autopath;
15use proc_macro::TokenStream;
16mod com;
17use com::component_scan;
18
19use crate::com::{scan_path_utils, path_utils};
20
21
22
23
24#[allow(warnings)]
25#[proc_macro_attribute]
26pub fn autowired(_attr: TokenStream, _input: TokenStream) -> TokenStream {
27    return com::autowired::impl_autowired(_attr, _input.clone());
28}
29
30
31
32/// # Overview
33
34/// `autoload` 基于 singlemap 实现 ioc aop autowired,更方便的集成库之间的使用:
35/// 包含 #[bean] #[aop] #[component_scan]
36
37/// ```rust
38/// // 展开
39/// // macro_rules! defsingle {
40/// //     () => {
41/// //         single_get_unwrap!( "defsingle", EntityObj)
42/// //     };
43/// // }
44/// #[autowired]
45///  static defsingle: Option<EntityObj> = None;
46
47
48/// //扫描 atesta::ioca路径下 scan_macro="bean" 使用bean宏标记的函数,扫描的内容会根据 调用宏component_scan的crate位置作为基础坐标,不用担心发布的crate扫描路径不正确的情况
49/// #[component_scan(scan_path="atesta::ioca",scan_suffix=".rs",scan_macro="bean")]
50/// pub fn lading(){
51///     println!("crate_ioc_path!() test");
52///     let a = single_get_unwrap!("get_bec",String);
53///     println!("输出 参数:{:?}",a);
54/// }
55
56/// //加载了一个bean
57/// #[bean]
58/// pub fn get_bec()->String{
59///     println!("加载了一个组件");
60///     String::from("99999")
61/// }
62
63/// //标记切入的bean
64/// #[aop(first_bean="set_aopa",last_bean="set_aopb")]
65/// pub fn set_aohhhhh(a:String,b:String)->String{
66///     println!("set_aohhhhh:{:?}",a);
67///     return String::from("888899");
68/// }
69
70/// //位于函数执行前获取到参数
71/// #[bean]
72/// pub fn set_aopa()->Box<(dyn Fn(Vec<Box<dyn Any>>) + Send + Sync )>{
73///     return Box::new(|r:Vec<Box<dyn Any>>|{
74///         println!("test bibao");
75///     });
76/// }
77
78/// //位于函数执行后获取到参数
79/// #[bean]
80/// pub fn set_aopb()->Box<(dyn Fn(Vec<Box<dyn Any>>) + Send + Sync )>{
81///     return Box::new(|r:Vec<Box<dyn Any>>|{
82///         println!("test bibaobbbbb");
83///     });
84/// }
85/// ```
86
87/// More patterns and use-cases are in the [docs](https://docs.rs/autoload/)!
88
89/// # Related crates
90/// * [dashMap](https://crates.io/crates/dashMap)
91/// * [once_cell](https://crates.io/crates/once_cell)
92/// * [singlemap](https://crates.io/crates/singlemap)
93
94#[allow(warnings)]
95#[proc_macro_attribute]
96pub fn bean(_attr: TokenStream, _input: TokenStream) -> TokenStream {
97    return _input;
98}
99
100#[proc_macro_attribute]
101pub fn component_scan(_attr: TokenStream, _input: TokenStream) -> TokenStream {
102    let  ast_path = path_utils::get_caller_path();
103    println!("ast_path:{}",ast_path);
104    if ast_path.is_empty(){
105        return _input;
106    }
107    component_scan::impl_component_scan(&_attr,&_input,&ast_path)
108}
109
110
111#[proc_macro_attribute]
112pub fn aop(_attr: TokenStream, _input: TokenStream) -> TokenStream {
113    return com::aop::impl_aop(&_attr,&_input);
114}
115
116#[proc_macro_attribute]
117pub fn starter_scan(_attr: TokenStream, _input: TokenStream) -> TokenStream {
118    let  ast_path = path_utils::get_caller_path();
119    println!("ast_path:{}",ast_path);
120    return com::starter_scan::impl_starter_scan(&_attr,&_input,&ast_path);
121}
122