polywrap_wasm_rs/
subinvoke.rs

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