1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use crate::{malloc::alloc, Context, Read, ReadDecoder};

#[link(wasm_import_module = "wrap")]
extern "C" {
    #[link_name = "__wrap_getImplementations"]
    pub fn __wrap_getImplementations(uri_ptr: u32, uri_len: u32) -> bool;

    #[link_name = "__wrap_getImplementations_result_len"]
    pub fn __wrap_getImplementations_result_len() -> u32;

    #[link_name = "__wrap_getImplementations_result"]
    pub fn __wrap_getImplementations_result(ptr: u32);
}

pub fn wrap_get_implementations(uri: &str) -> Vec<String> {
    let success =
        unsafe { __wrap_getImplementations(uri.as_bytes().as_ptr() as u32, uri.len() as u32) };

    if !success {
        return vec![];
    }

    let result_len = unsafe { __wrap_getImplementations_result_len() };
    let result_len_ptr = alloc(result_len as usize);
    let result_buffer =
        unsafe { Vec::from_raw_parts(result_len_ptr, result_len as usize, result_len as usize) };
    unsafe { __wrap_getImplementations_result(result_buffer.as_ptr() as u32) };

    // deserialize the `msgpack` buffer,
    // which contains a `Vec<String>`
    let mut decoder = ReadDecoder::new(&result_buffer, Context::new());
    decoder.context().push(
        "__wrap_getImplementations_result",
        "Vec<String>",
        "__wrap_getImplementations successful",
    );
    decoder.read_array(|reader| reader.read_string()).unwrap()
}