polywrap_wasm_rs/
subinvoke.rs1use crate::malloc::alloc;
2
3#[link(wasm_import_module = "wrap")]
4extern "C" {
5 #[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 #[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 #[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
31pub 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}