rudi_macro/
lib.rs

1mod commons;
2mod di_attr;
3mod field_or_argument_attr;
4mod impl_fn_or_enum_variant_attr;
5mod item_enum_gen;
6mod item_fn_gen;
7mod item_impl_gen;
8mod item_struct_gen;
9mod struct_or_function_attr;
10
11use from_attr::FromAttr;
12use proc_macro::TokenStream;
13use rudi_core::Scope;
14use syn::{parse_macro_input, spanned::Spanned, Item};
15
16use crate::struct_or_function_attr::StructOrFunctionAttr;
17
18fn generate(attr: TokenStream, item: TokenStream, scope: Scope) -> TokenStream {
19    let attr = match StructOrFunctionAttr::from_tokens(attr.into()) {
20        Ok(attr) => attr,
21        Err(err) => return err.to_compile_error().into(),
22    };
23
24    let item = parse_macro_input!(item as Item);
25
26    let result = match item {
27        Item::Struct(item_struct) => item_struct_gen::generate(attr, item_struct, scope),
28        Item::Enum(item_enum) => item_enum_gen::generate(attr, item_enum, scope),
29        Item::Fn(item_fn) => item_fn_gen::generate(attr, item_fn, scope),
30        Item::Impl(item_impl) => item_impl_gen::generate(attr, item_impl, scope),
31        _ => Err(syn::Error::new(
32            item.span(),
33            "expected `struct` or `enum` or `function` or `impl block`",
34        )),
35    };
36
37    result.unwrap_or_else(|e| e.to_compile_error()).into()
38}
39
40/// Define a singleton provider.
41#[doc = ""]
42#[doc = include_str!("./docs/attribute_macro.md")]
43#[proc_macro_attribute]
44#[allow(non_snake_case)]
45pub fn Singleton(attr: TokenStream, item: TokenStream) -> TokenStream {
46    generate(attr, item, Scope::Singleton)
47}
48
49/// Define a transient provider.
50#[doc = ""]
51#[doc = include_str!("./docs/attribute_macro.md")]
52#[proc_macro_attribute]
53#[allow(non_snake_case)]
54pub fn Transient(attr: TokenStream, item: TokenStream) -> TokenStream {
55    generate(attr, item, Scope::Transient)
56}
57
58/// Define a single owner provider.
59#[doc = ""]
60#[doc = include_str!("./docs/attribute_macro.md")]
61#[proc_macro_attribute]
62#[allow(non_snake_case)]
63pub fn SingleOwner(attr: TokenStream, item: TokenStream) -> TokenStream {
64    generate(attr, item, Scope::SingleOwner)
65}