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, 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}