wasmtime_c_api/types/
import.rs

1use crate::{wasm_externtype_t, wasm_name_t, CExternType};
2use std::cell::OnceCell;
3
4#[repr(C)]
5#[derive(Clone)]
6pub struct wasm_importtype_t {
7    pub(crate) module: String,
8    pub(crate) name: String,
9    pub(crate) ty: CExternType,
10    module_cache: OnceCell<wasm_name_t>,
11    name_cache: OnceCell<wasm_name_t>,
12    type_cache: OnceCell<wasm_externtype_t>,
13}
14
15wasmtime_c_api_macros::declare_ty!(wasm_importtype_t);
16
17impl wasm_importtype_t {
18    pub(crate) fn new(module: String, name: String, ty: CExternType) -> wasm_importtype_t {
19        wasm_importtype_t {
20            module,
21            name,
22            ty,
23            module_cache: OnceCell::new(),
24            name_cache: OnceCell::new(),
25            type_cache: OnceCell::new(),
26        }
27    }
28}
29
30#[unsafe(no_mangle)]
31pub extern "C" fn wasm_importtype_new(
32    module: &mut wasm_name_t,
33    name: &mut wasm_name_t,
34    ty: Box<wasm_externtype_t>,
35) -> Option<Box<wasm_importtype_t>> {
36    let module = module.take();
37    let name = name.take();
38    let module = String::from_utf8(module).ok()?;
39    let name = String::from_utf8(name).ok()?;
40    Some(Box::new(wasm_importtype_t::new(
41        module,
42        name,
43        ty.which.clone(),
44    )))
45}
46
47#[unsafe(no_mangle)]
48pub extern "C" fn wasm_importtype_module(it: &wasm_importtype_t) -> &wasm_name_t {
49    it.module_cache
50        .get_or_init(|| wasm_name_t::from_name(it.module.clone()))
51}
52
53#[unsafe(no_mangle)]
54pub extern "C" fn wasm_importtype_name(it: &wasm_importtype_t) -> &wasm_name_t {
55    it.name_cache
56        .get_or_init(|| wasm_name_t::from_name(it.name.to_string()))
57}
58
59#[unsafe(no_mangle)]
60pub extern "C" fn wasm_importtype_type(it: &wasm_importtype_t) -> &wasm_externtype_t {
61    it.type_cache
62        .get_or_init(|| wasm_externtype_t::from_cextern_type(it.ty.clone()))
63}