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_exporttype_t {
7     name: String,
8     ty: CExternType,
9     name_cache: OnceCell<wasm_name_t>,
10     type_cache: OnceCell<wasm_externtype_t>,
11 }
12 
13 wasmtime_c_api_macros::declare_ty!(wasm_exporttype_t);
14 
15 impl wasm_exporttype_t {
new(name: String, ty: CExternType) -> wasm_exporttype_t16     pub(crate) fn new(name: String, ty: CExternType) -> wasm_exporttype_t {
17         wasm_exporttype_t {
18             name,
19             ty,
20             name_cache: OnceCell::new(),
21             type_cache: OnceCell::new(),
22         }
23     }
24 }
25 
26 #[unsafe(no_mangle)]
wasm_exporttype_new( name: &mut wasm_name_t, ty: Box<wasm_externtype_t>, ) -> Option<Box<wasm_exporttype_t>>27 pub extern "C" fn wasm_exporttype_new(
28     name: &mut wasm_name_t,
29     ty: Box<wasm_externtype_t>,
30 ) -> Option<Box<wasm_exporttype_t>> {
31     let name = name.take();
32     let name = String::from_utf8(name).ok()?;
33     Some(Box::new(wasm_exporttype_t::new(name, ty.which.clone())))
34 }
35 
36 #[unsafe(no_mangle)]
wasm_exporttype_name(et: &wasm_exporttype_t) -> &wasm_name_t37 pub extern "C" fn wasm_exporttype_name(et: &wasm_exporttype_t) -> &wasm_name_t {
38     et.name_cache
39         .get_or_init(|| wasm_name_t::from_name(et.name.clone()))
40 }
41 
42 #[unsafe(no_mangle)]
wasm_exporttype_type(et: &wasm_exporttype_t) -> &wasm_externtype_t43 pub extern "C" fn wasm_exporttype_type(et: &wasm_exporttype_t) -> &wasm_externtype_t {
44     et.type_cache
45         .get_or_init(|| wasm_externtype_t::from_cextern_type(et.ty.clone()))
46 }
47