1#![feature(try_find)]
2
3mod cacheable;
4mod cacheable_dyn;
5mod hook;
6mod merge;
7mod plugin;
8mod runtime_module;
9mod source_map_config;
10
11#[proc_macro_attribute]
12pub fn impl_runtime_module(
13 args: proc_macro::TokenStream,
14 tokens: proc_macro::TokenStream,
15) -> proc_macro::TokenStream {
16 runtime_module::impl_runtime_module(args, tokens)
17}
18
19#[proc_macro_attribute]
20pub fn impl_source_map_config(
21 args: proc_macro::TokenStream,
22 tokens: proc_macro::TokenStream,
23) -> proc_macro::TokenStream {
24 source_map_config::impl_source_map_config(args, tokens)
25}
26
27#[proc_macro_attribute]
28pub fn plugin(
29 _args: proc_macro::TokenStream,
30 tokens: proc_macro::TokenStream,
31) -> proc_macro::TokenStream {
32 let item = syn::parse_macro_input!(tokens as syn::ItemStruct);
33 plugin::expand_struct(item)
34}
35
36#[proc_macro_attribute]
37pub fn plugin_hook(
38 args: proc_macro::TokenStream,
39 tokens: proc_macro::TokenStream,
40) -> proc_macro::TokenStream {
41 let args = syn::parse_macro_input!(args as plugin::HookArgs);
42 let input = syn::parse_macro_input!(tokens as syn::ItemFn);
43 plugin::expand_fn(args, input)
44}
45
46#[proc_macro]
47pub fn define_hook(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
48 let input = syn::parse_macro_input!(input as hook::DefineHookInput);
49 match input.expand() {
50 syn::Result::Ok(tt) => tt,
51 syn::Result::Err(err) => err.to_compile_error(),
52 }
53 .into()
54}
55
56#[proc_macro_derive(MergeFrom, attributes(merge_from))]
57pub fn merge_from_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
58 let input = syn::parse_macro_input!(input as syn::DeriveInput);
59 let output = merge::expand_merge_from_derive(input);
60 match output {
61 syn::Result::Ok(tt) => tt,
62 syn::Result::Err(err) => err.to_compile_error(),
63 }
64 .into()
65}
66
67#[proc_macro_attribute]
68pub fn enable_cacheable(
69 args: proc_macro::TokenStream,
70 tokens: proc_macro::TokenStream,
71) -> proc_macro::TokenStream {
72 cacheable::cacheable(args, tokens)
73}
74
75#[proc_macro_attribute]
76pub fn disable_cacheable(
77 args: proc_macro::TokenStream,
78 tokens: proc_macro::TokenStream,
79) -> proc_macro::TokenStream {
80 cacheable::disable_cacheable(args, tokens)
81}
82
83#[proc_macro_attribute]
84pub fn enable_cacheable_dyn(
85 _args: proc_macro::TokenStream,
86 tokens: proc_macro::TokenStream,
87) -> proc_macro::TokenStream {
88 let input = syn::parse_macro_input!(tokens as syn::Item);
89
90 match input {
91 syn::Item::Trait(input) => cacheable_dyn::impl_trait(input),
92 syn::Item::Impl(input) => cacheable_dyn::impl_impl(input),
93 _ => panic!("expect Trait or Impl"),
94 }
95}
96
97#[proc_macro_attribute]
98pub fn disable_cacheable_dyn(
99 _args: proc_macro::TokenStream,
100 tokens: proc_macro::TokenStream,
101) -> proc_macro::TokenStream {
102 cacheable_dyn::disable_cacheable_dyn(tokens)
103}