1 use crate::{
2     wasm_engine_t, wasm_functype_t, wasmtime_component_func_type_t,
3     wasmtime_component_instance_type_t, wasmtime_component_resource_type_t,
4     wasmtime_component_valtype_t, wasmtime_module_type_t,
5 };
6 use std::mem::{ManuallyDrop, MaybeUninit};
7 use wasmtime::component::types::{Component, ComponentItem};
8 
9 type_wrapper! {
10     pub struct wasmtime_component_type_t {
11         pub(crate) ty: Component,
12     }
13 
14     clone: wasmtime_component_type_clone,
15     delete: wasmtime_component_type_delete,
16 }
17 
18 #[unsafe(no_mangle)]
wasmtime_component_type_import_count( ty: &wasmtime_component_type_t, engine: &wasm_engine_t, ) -> usize19 pub extern "C" fn wasmtime_component_type_import_count(
20     ty: &wasmtime_component_type_t,
21     engine: &wasm_engine_t,
22 ) -> usize {
23     ty.ty.imports(&engine.engine).len()
24 }
25 
26 #[unsafe(no_mangle)]
wasmtime_component_type_import_get( ty: &wasmtime_component_type_t, engine: &wasm_engine_t, name: *const u8, name_len: usize, ret: &mut MaybeUninit<wasmtime_component_item_t>, ) -> bool27 pub unsafe extern "C" fn wasmtime_component_type_import_get(
28     ty: &wasmtime_component_type_t,
29     engine: &wasm_engine_t,
30     name: *const u8,
31     name_len: usize,
32     ret: &mut MaybeUninit<wasmtime_component_item_t>,
33 ) -> bool {
34     let name = unsafe { std::slice::from_raw_parts(name, name_len) };
35     let Ok(name) = std::str::from_utf8(name) else {
36         return false;
37     };
38     match ty.ty.get_import(&engine.engine, name) {
39         Some(item) => {
40             ret.write(item.into());
41             true
42         }
43         None => false,
44     }
45 }
46 
47 #[unsafe(no_mangle)]
wasmtime_component_type_import_nth( ty: &wasmtime_component_type_t, engine: &wasm_engine_t, nth: usize, name_ret: &mut MaybeUninit<*const u8>, name_len_ret: &mut MaybeUninit<usize>, type_ret: &mut MaybeUninit<wasmtime_component_item_t>, ) -> bool48 pub extern "C" fn wasmtime_component_type_import_nth(
49     ty: &wasmtime_component_type_t,
50     engine: &wasm_engine_t,
51     nth: usize,
52     name_ret: &mut MaybeUninit<*const u8>,
53     name_len_ret: &mut MaybeUninit<usize>,
54     type_ret: &mut MaybeUninit<wasmtime_component_item_t>,
55 ) -> bool {
56     match ty.ty.imports(&engine.engine).nth(nth) {
57         Some((name, item)) => {
58             let name: &str = name;
59             name_ret.write(name.as_ptr());
60             name_len_ret.write(name.len());
61             type_ret.write(item.into());
62             true
63         }
64         None => false,
65     }
66 }
67 
68 #[unsafe(no_mangle)]
wasmtime_component_type_export_count( ty: &wasmtime_component_type_t, engine: &wasm_engine_t, ) -> usize69 pub extern "C" fn wasmtime_component_type_export_count(
70     ty: &wasmtime_component_type_t,
71     engine: &wasm_engine_t,
72 ) -> usize {
73     ty.ty.exports(&engine.engine).len()
74 }
75 
76 #[unsafe(no_mangle)]
wasmtime_component_type_export_get( ty: &wasmtime_component_type_t, engine: &wasm_engine_t, name: *const u8, name_len: usize, ret: &mut MaybeUninit<wasmtime_component_item_t>, ) -> bool77 pub unsafe extern "C" fn wasmtime_component_type_export_get(
78     ty: &wasmtime_component_type_t,
79     engine: &wasm_engine_t,
80     name: *const u8,
81     name_len: usize,
82     ret: &mut MaybeUninit<wasmtime_component_item_t>,
83 ) -> bool {
84     let name = unsafe { std::slice::from_raw_parts(name, name_len) };
85     let Ok(name) = std::str::from_utf8(name) else {
86         return false;
87     };
88     match ty.ty.get_export(&engine.engine, name) {
89         Some(item) => {
90             ret.write(item.into());
91             true
92         }
93         None => false,
94     }
95 }
96 
97 #[unsafe(no_mangle)]
wasmtime_component_type_export_nth( ty: &wasmtime_component_type_t, engine: &wasm_engine_t, nth: usize, name_ret: &mut MaybeUninit<*const u8>, name_len_ret: &mut MaybeUninit<usize>, type_ret: &mut MaybeUninit<wasmtime_component_item_t>, ) -> bool98 pub extern "C" fn wasmtime_component_type_export_nth(
99     ty: &wasmtime_component_type_t,
100     engine: &wasm_engine_t,
101     nth: usize,
102     name_ret: &mut MaybeUninit<*const u8>,
103     name_len_ret: &mut MaybeUninit<usize>,
104     type_ret: &mut MaybeUninit<wasmtime_component_item_t>,
105 ) -> bool {
106     match ty.ty.exports(&engine.engine).nth(nth) {
107         Some((name, item)) => {
108             let name: &str = name;
109             name_ret.write(name.as_ptr());
110             name_len_ret.write(name.len());
111             type_ret.write(item.into());
112             true
113         }
114         None => false,
115     }
116 }
117 
118 #[derive(Clone)]
119 #[repr(C, u8)]
120 pub enum wasmtime_component_item_t {
121     Component(Box<wasmtime_component_type_t>),
122     ComponentInstance(Box<wasmtime_component_instance_type_t>),
123     Module(Box<wasmtime_module_type_t>),
124     ComponentFunc(Box<wasmtime_component_func_type_t>),
125     Resource(Box<wasmtime_component_resource_type_t>),
126     CoreFunc(Box<wasm_functype_t>),
127     Type(wasmtime_component_valtype_t),
128 }
129 
130 impl From<ComponentItem> for wasmtime_component_item_t {
from(item: ComponentItem) -> Self131     fn from(item: ComponentItem) -> Self {
132         match item {
133             ComponentItem::Component(ty) => {
134                 wasmtime_component_item_t::Component(Box::new(ty.into()))
135             }
136             ComponentItem::ComponentInstance(ty) => {
137                 wasmtime_component_item_t::ComponentInstance(Box::new(ty.into()))
138             }
139             ComponentItem::Module(ty) => wasmtime_component_item_t::Module(Box::new(ty.into())),
140             ComponentItem::ComponentFunc(ty) => {
141                 wasmtime_component_item_t::ComponentFunc(Box::new(ty.into()))
142             }
143             ComponentItem::Resource(ty) => wasmtime_component_item_t::Resource(Box::new(ty.into())),
144             ComponentItem::CoreFunc(ty) => {
145                 wasmtime_component_item_t::CoreFunc(Box::new(wasm_functype_t::new(ty)))
146             }
147             ComponentItem::Type(ty) => wasmtime_component_item_t::Type(ty.into()),
148         }
149     }
150 }
151 
152 #[unsafe(no_mangle)]
wasmtime_component_item_clone( item: &wasmtime_component_item_t, ret: &mut MaybeUninit<wasmtime_component_item_t>, )153 pub extern "C" fn wasmtime_component_item_clone(
154     item: &wasmtime_component_item_t,
155     ret: &mut MaybeUninit<wasmtime_component_item_t>,
156 ) {
157     ret.write(item.clone());
158 }
159 
160 #[unsafe(no_mangle)]
wasmtime_component_item_delete( item: &mut ManuallyDrop<wasmtime_component_item_t>, )161 pub extern "C" fn wasmtime_component_item_delete(
162     item: &mut ManuallyDrop<wasmtime_component_item_t>,
163 ) {
164     unsafe {
165         ManuallyDrop::drop(item);
166     }
167 }
168