wasmtime_c_api/component/types/
component.rs1use 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};
6use std::mem::{ManuallyDrop, MaybeUninit};
7use wasmtime::component::types::{Component, ComponentExtern, ComponentItem};
8
9type_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)]
19pub 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)]
27pub unsafe extern "C" fn wasmtime_component_type_import_get<'a>(
28 ty: &'a wasmtime_component_type_t,
29 engine: &'a wasm_engine_t,
30 name: *const u8,
31 name_len: usize,
32 ret: &mut MaybeUninit<Box<wasmtime_component_extern_t<'a>>>,
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(e) => {
40 ret.write(Box::new(e.into()));
41 true
42 }
43 None => false,
44 }
45}
46
47#[unsafe(no_mangle)]
48pub extern "C" fn wasmtime_component_type_import_nth<'a>(
49 ty: &'a wasmtime_component_type_t,
50 engine: &'a wasm_engine_t,
51 nth: usize,
52 name_ret: &mut MaybeUninit<*const u8>,
53 name_len_ret: &mut MaybeUninit<usize>,
54 ret: &mut MaybeUninit<Box<wasmtime_component_extern_t<'a>>>,
55) -> bool {
56 match ty.ty.imports(&engine.engine).nth(nth) {
57 Some((name, e)) => {
58 let name: &str = name;
59 name_ret.write(name.as_ptr());
60 name_len_ret.write(name.len());
61 ret.write(Box::new(e.into()));
62 true
63 }
64 None => false,
65 }
66}
67
68#[unsafe(no_mangle)]
69pub 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)]
77pub unsafe extern "C" fn wasmtime_component_type_export_get<'a>(
78 ty: &'a wasmtime_component_type_t,
79 engine: &'a wasm_engine_t,
80 name: *const u8,
81 name_len: usize,
82 ret: &mut MaybeUninit<Box<wasmtime_component_extern_t<'a>>>,
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(e) => {
90 ret.write(Box::new(e.into()));
91 true
92 }
93 None => false,
94 }
95}
96
97#[unsafe(no_mangle)]
98pub extern "C" fn wasmtime_component_type_export_nth<'a>(
99 ty: &'a wasmtime_component_type_t,
100 engine: &'a wasm_engine_t,
101 nth: usize,
102 name_ret: &mut MaybeUninit<*const u8>,
103 name_len_ret: &mut MaybeUninit<usize>,
104 ret: &mut MaybeUninit<Box<wasmtime_component_extern_t<'a>>>,
105) -> bool {
106 match ty.ty.exports(&engine.engine).nth(nth) {
107 Some((name, e)) => {
108 let name: &str = name;
109 name_ret.write(name.as_ptr());
110 name_len_ret.write(name.len());
111 ret.write(Box::new(e.into()));
112 true
113 }
114 None => false,
115 }
116}
117
118#[derive(Clone)]
119#[repr(C, u8)]
120pub 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
130impl From<ComponentItem> for wasmtime_component_item_t {
131 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)]
153pub 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)]
161pub 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
169pub struct wasmtime_component_extern_t<'a> {
170 e: ComponentExtern<'a>,
171}
172
173impl<'a> From<ComponentExtern<'a>> for wasmtime_component_extern_t<'a> {
174 fn from(e: ComponentExtern<'a>) -> Self {
175 wasmtime_component_extern_t { e }
176 }
177}
178
179#[unsafe(no_mangle)]
180pub extern "C" fn wasmtime_component_extern_clone<'a>(
181 e: &wasmtime_component_extern_t<'a>,
182) -> Box<wasmtime_component_extern_t<'a>> {
183 Box::new(wasmtime_component_extern_t { e: e.e.clone() })
184}
185
186#[unsafe(no_mangle)]
187pub extern "C" fn wasmtime_component_extern_type(
188 e: &wasmtime_component_extern_t<'_>,
189 ret: &mut MaybeUninit<wasmtime_component_item_t>,
190) {
191 ret.write(e.e.ty.clone().into());
192}
193
194fn optional_str(s: Option<&str>, len: &mut MaybeUninit<usize>) -> *const u8 {
195 match s {
196 Some(s) => {
197 len.write(s.len());
198 s.as_ptr()
199 }
200 None => {
201 len.write(0);
202 std::ptr::null()
203 }
204 }
205}
206
207#[unsafe(no_mangle)]
208pub extern "C" fn wasmtime_component_extern_implements(
209 e: &wasmtime_component_extern_t<'_>,
210 len: &mut MaybeUninit<usize>,
211) -> *const u8 {
212 optional_str(e.e.implements, len)
213}
214
215#[unsafe(no_mangle)]
216pub unsafe extern "C" fn wasmtime_component_extern_is_implements(
217 e: &wasmtime_component_extern_t<'_>,
218 name: *const u8,
219 len: usize,
220) -> bool {
221 let name = unsafe { crate::slice_from_raw_parts(name, len) };
222 let Ok(name) = std::str::from_utf8(name) else {
223 return false;
224 };
225 e.e.is_implements(name)
226}
227
228#[unsafe(no_mangle)]
229pub extern "C" fn wasmtime_component_extern_external_id(
230 e: &wasmtime_component_extern_t<'_>,
231 len: &mut MaybeUninit<usize>,
232) -> *const u8 {
233 optional_str(e.e.external_id, len)
234}
235
236#[unsafe(no_mangle)]
237pub extern "C" fn wasmtime_component_extern_delete(
238 _e: Option<Box<wasmtime_component_extern_t<'_>>>,
239) {
240}