Skip to main content

wasmtime_c_api/component/types/
component.rs

1use 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}