1 use crate::{CExternType, wasm_externtype_t, wasm_name_t};
2 use std::cell::OnceCell;
3 
4 #[repr(C)]
5 #[derive(Clone)]
6 pub 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 
15 wasmtime_c_api_macros::declare_ty!(wasm_importtype_t);
16 
17 impl wasm_importtype_t {
new(module: String, name: String, ty: CExternType) -> wasm_importtype_t18     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)]
wasm_importtype_new( module: &mut wasm_name_t, name: &mut wasm_name_t, ty: Box<wasm_externtype_t>, ) -> Option<Box<wasm_importtype_t>>31 pub 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)]
wasm_importtype_module(it: &wasm_importtype_t) -> &wasm_name_t48 pub 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)]
wasm_importtype_name(it: &wasm_importtype_t) -> &wasm_name_t54 pub 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)]
wasm_importtype_type(it: &wasm_importtype_t) -> &wasm_externtype_t60 pub 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 }
64