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;
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/// Generate an explicit-codec query or composite-query entrypoint.
42#[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/// Generate an explicit-codec update entrypoint.
48#[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/// Generate an initialization entrypoint with explicit argument decoding.
54#[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/// Generate a pre-upgrade entrypoint in the shared runtime context.
60#[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/// Generate a post-upgrade entrypoint with explicit argument decoding.
66#[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/// Generate a heartbeat entrypoint in the shared runtime context.
72#[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/// Generate a message inspection entrypoint in the shared runtime context.
78#[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/// Generate a low-Wasm-memory entrypoint in the shared runtime context.
84#[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/// Generate a bounded required-external-Candid query with explicit artifact policy.
95#[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/// Generate a bounded required-external-Candid update with explicit artifact policy.
105#[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}