springtime_di_derive/
lib.rs1use 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}