/
lib.rs
93 lines (78 loc) · 2.68 KB
/
lib.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#![doc = include_str!("../README.md")]
#![warn(
elided_lifetimes_in_paths,
missing_debug_implementations,
unsafe_op_in_unsafe_fn,
clippy::undocumented_unsafe_blocks,
clippy::missing_safety_doc
)]
use proc_macro::TokenStream;
use syn::Error;
mod export;
fn handle_debug_and_errors<F>(
cb: F,
name: &str,
attr: TokenStream,
item: TokenStream,
) -> TokenStream
where
F: FnOnce(
proc_macro2::TokenStream,
proc_macro2::TokenStream,
) -> Result<proc_macro2::TokenStream, Error>,
{
if std::env::var_os("IC_CDK_DEBUG").is_some() {
eprintln!("--- IC_CDK_MACROS DEBUG ---");
eprintln!("{}\n attr: {}\n item: {}", name, attr, item);
}
let result = cb(attr.into(), item.into());
if std::env::var_os("IC_CDK_DEBUG").is_some() {
eprintln!("--------- RESULT ---------");
if let Ok(ref stream) = result {
eprintln!("{}", stream);
}
eprintln!("---------------------------");
}
result.map_or_else(|e| e.to_compile_error().into(), Into::into)
}
#[proc_macro]
pub fn export_candid(input: TokenStream) -> TokenStream {
let input: proc_macro2::TokenStream = input.into();
quote::quote! {
::candid::export_service!(#input);
#[no_mangle]
pub fn get_candid_pointer() -> *mut std::os::raw::c_char {
let c_string = std::ffi::CString::new(__export_service()).unwrap();
c_string.into_raw()
}
}
.into()
}
#[proc_macro_attribute]
pub fn query(attr: TokenStream, item: TokenStream) -> TokenStream {
handle_debug_and_errors(export::ic_query, "ic_query", attr, item)
}
#[proc_macro_attribute]
pub fn update(attr: TokenStream, item: TokenStream) -> TokenStream {
handle_debug_and_errors(export::ic_update, "ic_update", attr, item)
}
#[proc_macro_attribute]
pub fn init(attr: TokenStream, item: TokenStream) -> TokenStream {
handle_debug_and_errors(export::ic_init, "ic_init", attr, item)
}
#[proc_macro_attribute]
pub fn pre_upgrade(attr: TokenStream, item: TokenStream) -> TokenStream {
handle_debug_and_errors(export::ic_pre_upgrade, "ic_pre_upgrade", attr, item)
}
#[proc_macro_attribute]
pub fn post_upgrade(attr: TokenStream, item: TokenStream) -> TokenStream {
handle_debug_and_errors(export::ic_post_upgrade, "ic_post_upgrade", attr, item)
}
#[proc_macro_attribute]
pub fn heartbeat(attr: TokenStream, item: TokenStream) -> TokenStream {
handle_debug_and_errors(export::ic_heartbeat, "ic_heartbeat", attr, item)
}
#[proc_macro_attribute]
pub fn inspect_message(attr: TokenStream, item: TokenStream) -> TokenStream {
handle_debug_and_errors(export::ic_inspect_message, "ic_inspect_message", attr, item)
}