1mod autowired_attr;
2mod commons;
3mod field_or_argument_attr;
4mod impl_fn_or_enum_variant_attr;
5mod impl_properties_macro;
6mod item_enum_gen;
7mod item_fn_gen;
8mod item_impl_gen;
9mod item_struct_gen;
10mod properties_attr;
11mod struct_or_function_attr;
12
13use from_attr::FromAttr;
14use proc_macro::TokenStream;
15use properties_attr::PropertiesAttr;
16use rudi_core::Scope;
17use syn::{parse_macro_input, spanned::Spanned, Item};
18
19use crate::struct_or_function_attr::StructOrFunctionAttr;
20
21fn generate(attr: TokenStream, item: TokenStream, scope: Scope) -> TokenStream {
22 let attr = match StructOrFunctionAttr::from_tokens(attr.into()) {
23 Ok(attr) => attr,
24 Err(err) => return err.to_compile_error().into(),
25 };
26
27 let item = parse_macro_input!(item as Item);
28
29 let result = match item {
30 Item::Struct(item_struct) => item_struct_gen::generate(attr, item_struct, scope),
31 Item::Enum(item_enum) => item_enum_gen::generate(attr, item_enum, scope),
32 Item::Fn(item_fn) => item_fn_gen::generate(attr, item_fn, scope),
33 Item::Impl(item_impl) => item_impl_gen::generate(attr, item_impl, scope),
34 _ => Err(syn::Error::new(
35 item.span(),
36 "expected `struct` or `enum` or `function` or `impl block`",
37 )),
38 };
39
40 result.unwrap_or_else(|e| e.to_compile_error()).into()
41}
42
43fn generate_from_properties(attr: TokenStream, item: TokenStream) -> TokenStream {
44 let attr = match PropertiesAttr::from_tokens(attr.into()) {
45 Ok(attr) => attr,
46 Err(err) => return err.to_compile_error().into(),
47 };
48
49 let item = parse_macro_input!(item as Item);
50
51 let result = match item {
52 Item::Struct(item_struct) => impl_properties_macro::generate(attr, item_struct),
53 _ => Err(syn::Error::new(item.span(), "expected `struct`")),
54 };
55 result.unwrap_or_else(|e| e.to_compile_error()).into()
56}
57
58#[doc = ""]
60#[doc = include_str!("./docs/attribute_macro.md")]
61#[proc_macro_attribute]
62#[allow(non_snake_case)]
63pub fn Singleton(attr: TokenStream, item: TokenStream) -> TokenStream {
64 generate(attr, item, Scope::Singleton)
65}
66
67#[doc = ""]
69#[doc = include_str!("./docs/attribute_macro.md")]
70#[proc_macro_attribute]
71#[allow(non_snake_case)]
72pub fn Transient(attr: TokenStream, item: TokenStream) -> TokenStream {
73 generate(attr, item, Scope::Transient)
74}
75
76#[doc = ""]
78#[doc = include_str!("./docs/attribute_macro.md")]
79#[proc_macro_attribute]
80#[allow(non_snake_case)]
81pub fn SingleOwner(attr: TokenStream, item: TokenStream) -> TokenStream {
82 generate(attr, item, Scope::SingleOwner)
83}
84
85#[doc = ""]
89#[doc = include_str!("./docs/attribute_macro.md")]
90#[proc_macro_attribute]
91#[allow(non_snake_case)]
92pub fn Properties(attr: TokenStream, item: TokenStream) -> TokenStream {
93 generate_from_properties(attr, item)
94}