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