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#[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#[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#[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}