wasmtime_c_api/types/
import.rs1use 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}