rudi_macro_dev/
lib.rs

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/// Define a singleton provider.
59#[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/// Define a transient provider.
68#[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/// Define a single owner provider.
77#[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/// Define a properties. 
86/// Please use in conjunction with this macro: `#[rudi::Singleton(eager_create = true)]`
87/// Please add serde_yaml to your dependencies.
88#[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}