rust_dix_macros/lib.rs
1//! rust-di procedural macros.
2
3use proc_macro::TokenStream;
4use quote::quote;
5use syn::parse_macro_input;
6
7mod field_init;
8mod inject_attr;
9mod inject_derive;
10mod module;
11
12// ───────────────────────────────────────────────────────────────────────────
13// #[derive(Inject)] — auto-generate constructor from struct fields
14// ───────────────────────────────────────────────────────────────────────────
15
16#[proc_macro_derive(Inject, attributes(inject))]
17pub fn inject_derive(input: TokenStream) -> TokenStream {
18 inject_derive::expand_inject_derive(parse_macro_input!(input as syn::DeriveInput))
19 .unwrap_or_else(|e| e.to_compile_error())
20 .into()
21}
22
23// ───────────────────────────────────────────────────────────────────────────
24// register!() — function-like placeholder macro for use inside #[module]
25// ───────────────────────────────────────────────────────────────────────────
26
27#[proc_macro]
28pub fn register(_: TokenStream) -> TokenStream {
29 quote! {}.into()
30}
31
32// ───────────────────────────────────────────────────────────────────────────
33// #[module] — compile-time module scanning for register!() declarations
34// ───────────────────────────────────────────────────────────────────────────
35
36#[proc_macro_attribute]
37pub fn module(_: TokenStream, item: TokenStream) -> TokenStream {
38 module::expand_md(parse_macro_input!(item as syn::ItemMod))
39 .unwrap_or_else(|e| e.to_compile_error())
40 .into()
41}
42
43// ───────────────────────────────────────────────────────────────────────────
44// #[inject] — attribute macro for auto-registration
45// ───────────────────────────────────────────────────────────────────────────
46
47#[proc_macro_attribute]
48pub fn inject(attr: TokenStream, item: TokenStream) -> TokenStream {
49 inject_attr::expand_inject(
50 parse_macro_input!(attr as inject_attr::InjectArgs),
51 parse_macro_input!(item as syn::Item),
52 )
53 .unwrap_or_else(|e| e.to_compile_error())
54 .into()
55}