web3api_wasm_rs/
subinvoke.rs

1use crate::malloc::alloc;
2
3#[link(wasm_import_module = "w3")]
4extern "C" {
5    /// Subinvoke API
6    #[link_name = "__w3_subinvoke"]
7    pub fn __w3_subinvoke(
8        uri_ptr: u32,
9        uri_len: u32,
10        module_ptr: u32,
11        module_len: u32,
12        method_ptr: u32,
13        method_len: u32,
14        input_ptr: u32,
15        input_len: u32,
16    ) -> bool;
17
18    /// Subinvoke Result
19    #[link_name = "__w3_subinvoke_result_len"]
20    pub fn __w3_subinvoke_result_len() -> u32;
21
22    #[link_name = "__w3_subinvoke_result"]
23    pub fn __w3_subinvoke_result(ptr: u32);
24
25    /// Subinvoke Error
26    #[link_name = "__w3_subinvoke_error_len"]
27    pub fn __w3_subinvoke_error_len() -> u32;
28
29    #[link_name = "__w3_subinvoke_error"]
30    pub fn __w3_subinvoke_error(ptr: u32);
31}
32
33/// Subinvoke API Helper
34pub fn w3_subinvoke(
35    uri: &str,
36    module: &str,
37    method: &str,
38    input: Vec<u8>,
39) -> Result<Vec<u8>, String> {
40    let uri_buf = uri.as_bytes();
41    let module_buf = module.as_bytes();
42    let method_buf = method.as_bytes();
43
44    let success = unsafe {
45        __w3_subinvoke(
46            uri_buf.as_ptr() as u32,
47            uri_buf.len() as u32,
48            module_buf.as_ptr() as u32,
49            module_buf.len() as u32,
50            method_buf.as_ptr() as u32,
51            method_buf.len() as u32,
52            input.as_ptr() as u32,
53            input.len() as u32,
54        )
55    };
56    if !success {
57        let error_len = unsafe { __w3_subinvoke_error_len() };
58        let error_len_ptr = alloc(error_len as usize);
59        unsafe { __w3_subinvoke_error(error_len_ptr as u32) };
60        let error = unsafe {
61            String::from_raw_parts(error_len_ptr, error_len as usize, error_len as usize)
62        };
63        return Err(error);
64    }
65    let result_len = unsafe { __w3_subinvoke_result_len() };
66    let result_len_ptr = alloc(result_len as usize);
67    unsafe { __w3_subinvoke_result(result_len_ptr as u32) };
68    let result_buf =
69        unsafe { Vec::from_raw_parts(result_len_ptr, result_len as usize, result_len as usize) };
70    Ok(result_buf)
71}