Skip to main content

ic_platform_macros/
lib.rs

1#![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/// Generate an explicit-codec query or composite-query entrypoint.
39#[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/// Generate an explicit-codec update entrypoint.
45#[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/// Generate an initialization entrypoint with explicit argument decoding.
51#[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/// Generate a pre-upgrade entrypoint in the shared runtime context.
57#[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/// Generate a post-upgrade entrypoint with explicit argument decoding.
63#[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/// Generate a heartbeat entrypoint in the shared runtime context.
69#[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/// Generate a message inspection entrypoint in the shared runtime context.
75#[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/// Generate a low-Wasm-memory entrypoint in the shared runtime context.
81#[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}