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, 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(
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)]
48pub 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)]
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(
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)]
98pub 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)]
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}