ic_platform_macros/
lib.rs1#![doc = include_str!("../README.md")]
2
3use proc_macro::TokenStream;
4use syn::Error;
5
6mod export;
7
8fn handle_debug_and_errors<F>(
9 cb: F,
10 name: &str,
11 attr: TokenStream,
12 item: TokenStream,
13) -> TokenStream
14where
15 F: FnOnce(
16 proc_macro2::TokenStream,
17 proc_macro2::TokenStream,
18 ) -> Result<proc_macro2::TokenStream, Error>,
19{
20 if std::env::var_os("IC_CDK_DEBUG").is_some() {
21 eprintln!("--- IC_CDK_MACROS DEBUG ---");
22 eprintln!("{name}\n attr: {attr}\n item: {item}");
23 }
24
25 let result = cb(attr.into(), item.into());
26
27 if std::env::var_os("IC_CDK_DEBUG").is_some() {
28 eprintln!("--------- RESULT ---------");
29 if let Ok(ref stream) = result {
30 eprintln!("{stream}");
31 }
32 eprintln!("---------------------------");
33 }
34
35 result.map_or_else(|e| e.to_compile_error().into(), Into::into)
36}
37
38#[proc_macro_attribute]
40pub fn query(attr: TokenStream, item: TokenStream) -> TokenStream {
41 handle_debug_and_errors(export::ic_query, "ic_query", attr, item)
42}
43
44#[proc_macro_attribute]
46pub fn update(attr: TokenStream, item: TokenStream) -> TokenStream {
47 handle_debug_and_errors(export::ic_update, "ic_update", attr, item)
48}
49
50#[proc_macro_attribute]
52pub fn init(attr: TokenStream, item: TokenStream) -> TokenStream {
53 handle_debug_and_errors(export::ic_init, "ic_init", attr, item)
54}
55
56#[proc_macro_attribute]
58pub fn pre_upgrade(attr: TokenStream, item: TokenStream) -> TokenStream {
59 handle_debug_and_errors(export::ic_pre_upgrade, "ic_pre_upgrade", attr, item)
60}
61
62#[proc_macro_attribute]
64pub fn post_upgrade(attr: TokenStream, item: TokenStream) -> TokenStream {
65 handle_debug_and_errors(export::ic_post_upgrade, "ic_post_upgrade", attr, item)
66}
67
68#[proc_macro_attribute]
70pub fn heartbeat(attr: TokenStream, item: TokenStream) -> TokenStream {
71 handle_debug_and_errors(export::ic_heartbeat, "ic_heartbeat", attr, item)
72}
73
74#[proc_macro_attribute]
76pub fn inspect_message(attr: TokenStream, item: TokenStream) -> TokenStream {
77 handle_debug_and_errors(export::ic_inspect_message, "ic_inspect_message", attr, item)
78}
79
80#[proc_macro_attribute]
82pub fn on_low_wasm_memory(attr: TokenStream, item: TokenStream) -> TokenStream {
83 handle_debug_and_errors(
84 export::ic_on_low_wasm_memory,
85 "ic_on_low_wasm_memory",
86 attr,
87 item,
88 )
89}