1extern crate alloc;
2
3use alloc::string::String;
4use alloc::vec;
5
6pub use clique_wasm_types::{val::Val, val_type::ValType};
7
8extern "C" {
9 fn console_log_internal(ptr: *const u8, len: usize);
10 fn get_param_len_internal(key_ptr: *const u8, key_len: usize) -> usize;
11 fn get_param_value_internal(key_ptr: *const u8, key_len: usize, value_ptr: *mut u8) -> i32;
12 fn set_output_internal(
13 key_ptr: *const u8,
14 key_len: usize,
15 value_ptr: *const u8,
16 value_len: usize,
17 ) -> i32;
18}
19
20pub fn console_log(message: &str) {
21 unsafe {
22 console_log_internal(message.as_ptr(), message.len());
23 }
24}
25
26pub fn get_param(key: &str) -> Result<Option<Val>, String> {
27 let bytes = unsafe {
28 let key_ptr = key.as_ptr();
29 let key_len = key.len();
30 let value_len = get_param_len_internal(key_ptr, key_len);
31 if value_len > 0 {
32 let mut value = vec![0u8; value_len];
33 let result = get_param_value_internal(key_ptr, key_len, value.as_mut_ptr());
34 if result == 1 {
35 Some(value)
36 } else {
37 None
38 }
39 } else {
40 None
41 }
42 };
43 if let Some(bytes) = bytes {
44 Ok(Some(Val::from_bytes(&bytes)?))
45 } else {
46 Ok(None)
47 }
48}
49
50pub fn set_output(key: &str, value: &Val) -> bool {
51 let value_bytes = value.to_bytes();
52 let result = unsafe {
53 set_output_internal(
54 key.as_ptr(),
55 key.len(),
56 value_bytes.as_ptr(),
57 value_bytes.len(),
58 )
59 };
60 result == 1
61}