portrait_codegen/
lib.rs

1use proc_macro::TokenStream;
2
3mod util;
4
5mod make;
6#[proc_macro_attribute]
7pub fn make(attr: TokenStream, item: TokenStream) -> TokenStream {
8    make::run(attr.into(), item.into()).unwrap_or_else(|err| err.into_compile_error()).into()
9}
10
11mod fill;
12#[proc_macro_attribute]
13pub fn fill(attr: TokenStream, item: TokenStream) -> TokenStream {
14    fill::run(attr.into(), item.into()).unwrap_or_else(|err| err.into_compile_error()).into()
15}
16
17mod derive;
18#[proc_macro_attribute]
19pub fn derive(attr: TokenStream, item: TokenStream) -> TokenStream {
20    derive::run(attr.into(), item.into()).unwrap_or_else(|err| err.into_compile_error()).into()
21}
22
23macro_rules! fillers {
24    ($dir:ident $completer_filler:ident: $($names:ident = $feature:literal,)*) => {
25        mod $dir {
26            $(
27                #[cfg(feature = $feature)]
28                pub(super) mod $names;
29            )*
30        }
31
32        $(
33            #[cfg(feature = $feature)]
34            #[proc_macro]
35            pub fn $names(input: TokenStream) -> TokenStream {
36                portrait_framework::$completer_filler(input, $dir::$names::Generator)
37            }
38        )*
39    }
40}
41
42fillers! { derive_fillers completer_derive_filler:
43    derive_delegate = "derive-delegate-filler",
44}
45
46fillers! { impl_fillers completer_impl_filler:
47    default = "default-filler",
48    delegate = "delegate-filler",
49    log = "log-filler",
50}