springtime_di_derive/
lib.rs

1use crate::attributes::ComponentAliasAttributes;
2use crate::component::{expand_component, generate_injectable, register_component_alias};
3use proc_macro::TokenStream;
4use quote::quote;
5use syn::{parse_macro_input, DeriveInput, Error, Item};
6
7mod attributes;
8mod component;
9
10#[proc_macro_derive(Component, attributes(component))]
11pub fn generate_component(input: TokenStream) -> TokenStream {
12    let input = parse_macro_input!(input as DeriveInput);
13    expand_component(&input)
14        .unwrap_or_else(Error::into_compile_error)
15        .into()
16}
17
18#[proc_macro_attribute]
19pub fn injectable(_args: TokenStream, input: TokenStream) -> TokenStream {
20    let item = parse_macro_input!(input as Item);
21    let injectable = generate_injectable(&item).unwrap_or_else(Error::into_compile_error);
22
23    (quote! {
24        #item
25        #injectable
26    })
27    .into()
28}
29
30#[proc_macro_attribute]
31pub fn component_alias(args: TokenStream, input: TokenStream) -> TokenStream {
32    let args = parse_macro_input!(args as ComponentAliasAttributes);
33    let item = parse_macro_input!(input as Item);
34    let registration =
35        register_component_alias(&item, &args).unwrap_or_else(Error::into_compile_error);
36
37    (quote! {
38        #item
39        #registration
40    })
41    .into()
42}