Skip to main content

rust_dix_macros/
lib.rs

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