web3api_wasm_rs/
get_implementations.rs

1use crate::{malloc::alloc, Context, Read, ReadDecoder};
2
3#[link(wasm_import_module = "w3")]
4extern "C" {
5    #[link_name = "__w3_getImplementations"]
6    pub fn __w3_getImplementations(uri_ptr: u32, uri_len: u32) -> bool;
7
8    #[link_name = "__w3_getImplementations_result_len"]
9    pub fn __w3_getImplementations_result_len() -> u32;
10
11    #[link_name = "__w3_getImplementations_result"]
12    pub fn __w3_getImplementations_result(ptr: u32);
13}
14
15pub fn w3_get_implementations(uri: &str) -> Vec<String> {
16    let success =
17        unsafe { __w3_getImplementations(uri.as_bytes().as_ptr() as u32, uri.len() as u32) };
18
19    if !success {
20        return vec![];
21    }
22
23    let result_len = unsafe { __w3_getImplementations_result_len() };
24    let result_len_ptr = alloc(result_len as usize);
25    let result_buffer =
26        unsafe { Vec::from_raw_parts(result_len_ptr, result_len as usize, result_len as usize) };
27    unsafe { __w3_getImplementations_result(result_buffer.as_ptr() as u32) };
28
29    // deserialize the `msgpack` buffer,
30    // which contains a `Vec<String>`
31    let mut decoder = ReadDecoder::new(&result_buffer, Context::new());
32    decoder.context().push(
33        "__w3_getImplementations_result",
34        "Vec<String>",
35        "__w3_getImplementations successful",
36    );
37    decoder.read_array(|reader| reader.read_string()).unwrap()
38}