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