Skip to main content

alun_macros/
lib.rs

1//! Alun proc macros
2//!
3//! 核心价值:用编译时代码生成替代 Java 的反射 + 注解 + classpath 扫描。
4
5mod route;
6mod plugin;
7mod task_handler;
8
9use proc_macro::TokenStream;
10
11/// 标记路由控制器类
12#[proc_macro_attribute]
13pub fn controller(attr: TokenStream, item: TokenStream) -> TokenStream {
14    route::controller_impl(attr, item)
15}
16
17/// GET 路由
18#[proc_macro_attribute]
19pub fn get(attr: TokenStream, item: TokenStream) -> TokenStream {
20    route::method_route_impl("get", attr, item)
21}
22
23/// POST 路由
24#[proc_macro_attribute]
25pub fn post(attr: TokenStream, item: TokenStream) -> TokenStream {
26    route::method_route_impl("post", attr, item)
27}
28
29/// PUT 路由
30#[proc_macro_attribute]
31pub fn put(attr: TokenStream, item: TokenStream) -> TokenStream {
32    route::method_route_impl("put", attr, item)
33}
34
35/// DELETE 路由
36#[proc_macro_attribute]
37pub fn delete(attr: TokenStream, item: TokenStream) -> TokenStream {
38    route::method_route_impl("delete", attr, item)
39}
40
41/// 权限拦截:为处理器添加方法级权限校验
42///
43/// # 参数
44///
45/// ```ignore
46/// #[alun::permission(path = "/api/admin/stats", method = "GET", permission = "admin:access")]
47/// async fn admin_stats() -> Res<Value> { ... }
48/// ```
49///
50/// 编译时收集到 `PERMISSION_ROUTES` 切片,启动时由 `AlunRouter` 统一应用 `RequirePermissionLayer`。
51#[proc_macro_attribute]
52pub fn permission(attr: TokenStream, item: TokenStream) -> TokenStream {
53    route::permission_impl(attr, item)
54}
55
56/// 标记无需认证的路由路径
57///
58/// # 参数
59///
60/// ```ignore
61/// #[alun::no_auth("/api/public")]
62/// #[alun::get("/api/public")]
63/// async fn public_api() -> Res<Value> { ... }
64/// ```
65///
66/// 编译时收集到 `NO_AUTH_ROUTES` 切片,启动时与配置文件中的 `ignore_paths` 合并。
67/// 即使在无需认证的路径上,如果提供了有效 Token,仍然会解析并注入用户信息到 extensions。
68#[proc_macro_attribute]
69pub fn no_auth(attr: TokenStream, item: TokenStream) -> TokenStream {
70    route::no_auth_impl(attr, item)
71}
72
73/// 标记类型为插件,编译期自动注册
74#[proc_macro_attribute]
75pub fn plugin(_attr: TokenStream, item: TokenStream) -> TokenStream {
76    plugin::plugin_impl(item)
77}
78
79/// 标记 TaskHandler 实现,编译期自动注册到 TASK_HANDLERS 分布式切片
80///
81/// 配合 `HandlerRegistry::from_discovered()` 在运行时批量注册。
82///
83/// # 参数
84///
85/// | 参数 | 类型 | 默认值 | 说明 |
86/// |------|------|--------|------|
87/// | `task_type` | i16 | **必填** | 任务类型标识,唯一 |
88/// | `topic` | &str | "task_{task_type}" | Kafka topic |
89/// | `priority` | Normal/High/Low/Critical | Normal | 优先级 |
90/// | `timeout_seconds` | u64 | 300 | 超时秒数 |
91/// | `max_retries` | u32 | 3 | 最大重试次数 |
92/// | `description` | &str | "" | 任务描述 |
93/// | `dead_letter_topic` | Option<&str> | None | 死信队列 topic |
94///
95/// # 示例
96///
97/// ```ignore
98/// #[task_handler(task_type = 1, topic = "export", timeout_seconds = 60)]
99/// struct ExportHandler;
100///
101/// #[async_trait]
102/// impl TaskHandler for ExportHandler {
103///     fn task_type(&self) -> i16 { 1 }
104///     async fn execute(&self, payload: Value) -> Result<Value, String> {
105///         Ok(json!({"file": "https://..."}))
106///     }
107/// }
108/// ```
109#[proc_macro_attribute]
110pub fn task_handler(attr: TokenStream, item: TokenStream) -> TokenStream {
111    task_handler::task_handler_impl(attr, item)
112}