ic_platform_macros/
lib.rs1#![doc = include_str!("../README.md")]
2
3use proc_macro::TokenStream;
4use syn::Error;
5
6mod export;
7mod external_candid;
8mod options;
9mod signature;
10
11fn handle_debug_and_errors<F>(
12 cb: F,
13 name: &str,
14 attr: TokenStream,
15 item: TokenStream,
16) -> TokenStream
17where
18 F: FnOnce(
19 proc_macro2::TokenStream,
20 proc_macro2::TokenStream,
21 ) -> Result<proc_macro2::TokenStream, Error>,
22{
23 if std::env::var_os("IC_CDK_DEBUG").is_some() {
24 eprintln!("--- IC_CDK_MACROS DEBUG ---");
25 eprintln!("{name}\n attr: {attr}\n item: {item}");
26 }
27
28 let result = cb(attr.into(), item.into());
29
30 if std::env::var_os("IC_CDK_DEBUG").is_some() {
31 eprintln!("--------- RESULT ---------");
32 if let Ok(ref stream) = result {
33 eprintln!("{stream}");
34 }
35 eprintln!("---------------------------");
36 }
37
38 result.map_or_else(|e| e.to_compile_error().into(), Into::into)
39}
40
41#[proc_macro_attribute]
43pub fn query(attr: TokenStream, item: TokenStream) -> TokenStream {
44 handle_debug_and_errors(export::ic_query, "ic_query", attr, item)
45}
46
47#[proc_macro_attribute]
49pub fn update(attr: TokenStream, item: TokenStream) -> TokenStream {
50 handle_debug_and_errors(export::ic_update, "ic_update", attr, item)
51}
52
53#[proc_macro_attribute]
55pub fn init(attr: TokenStream, item: TokenStream) -> TokenStream {
56 handle_debug_and_errors(export::ic_init, "ic_init", attr, item)
57}
58
59#[proc_macro_attribute]
61pub fn pre_upgrade(attr: TokenStream, item: TokenStream) -> TokenStream {
62 handle_debug_and_errors(export::ic_pre_upgrade, "ic_pre_upgrade", attr, item)
63}
64
65#[proc_macro_attribute]
67pub fn post_upgrade(attr: TokenStream, item: TokenStream) -> TokenStream {
68 handle_debug_and_errors(export::ic_post_upgrade, "ic_post_upgrade", attr, item)
69}
70
71#[proc_macro_attribute]
73pub fn heartbeat(attr: TokenStream, item: TokenStream) -> TokenStream {
74 handle_debug_and_errors(export::ic_heartbeat, "ic_heartbeat", attr, item)
75}
76
77#[proc_macro_attribute]
79pub fn inspect_message(attr: TokenStream, item: TokenStream) -> TokenStream {
80 handle_debug_and_errors(export::ic_inspect_message, "ic_inspect_message", attr, item)
81}
82
83#[proc_macro_attribute]
85pub fn on_low_wasm_memory(attr: TokenStream, item: TokenStream) -> TokenStream {
86 handle_debug_and_errors(
87 export::ic_on_low_wasm_memory,
88 "ic_on_low_wasm_memory",
89 attr,
90 item,
91 )
92}
93
94#[proc_macro_attribute]
96pub fn candid_query(attr: TokenStream, item: TokenStream) -> TokenStream {
97 handle_debug_and_errors(
98 |attr, item| external_candid::expand(true, attr, item),
99 "candid_query",
100 attr,
101 item,
102 )
103}
104#[proc_macro_attribute]
106pub fn candid_update(attr: TokenStream, item: TokenStream) -> TokenStream {
107 handle_debug_and_errors(
108 |attr, item| external_candid::expand(false, attr, item),
109 "candid_update",
110 attr,
111 item,
112 )
113}