rudi_macro_dev/
lib.rs

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