wasmtime_c_api/component/types/
val.rs1use crate::wasmtime_component_resource_type_t;
2use std::mem::{ManuallyDrop, MaybeUninit};
3use wasmtime::component::types::*;
4
5#[derive(Clone, PartialEq)]
6#[repr(C, u8)]
7pub enum wasmtime_component_valtype_t {
8 Bool,
9 S8,
10 S16,
11 S32,
12 S64,
13 U8,
14 U16,
15 U32,
16 U64,
17 F32,
18 F64,
19 Char,
20 String,
21 List(Box<wasmtime_component_list_type_t>),
22 Record(Box<wasmtime_component_record_type_t>),
23 Tuple(Box<wasmtime_component_tuple_type_t>),
24 Variant(Box<wasmtime_component_variant_type_t>),
25 Enum(Box<wasmtime_component_enum_type_t>),
26 Option(Box<wasmtime_component_option_type_t>),
27 Result(Box<wasmtime_component_result_type_t>),
28 Flags(Box<wasmtime_component_flags_type_t>),
29 Own(Box<wasmtime_component_resource_type_t>),
30 Borrow(Box<wasmtime_component_resource_type_t>),
31 Future(Box<wasmtime_component_future_type_t>),
32 Stream(Box<wasmtime_component_stream_type_t>),
33 ErrorContext,
34 Map(Box<wasmtime_component_map_type_t>),
35}
36
37impl From<Type> for wasmtime_component_valtype_t {
38 fn from(item: Type) -> Self {
39 match item {
40 Type::Bool => Self::Bool,
41 Type::S8 => Self::S8,
42 Type::S16 => Self::S16,
43 Type::S32 => Self::S32,
44 Type::S64 => Self::S64,
45 Type::U8 => Self::U8,
46 Type::U16 => Self::U16,
47 Type::U32 => Self::U32,
48 Type::U64 => Self::U64,
49 Type::Float32 => Self::F32,
50 Type::Float64 => Self::F64,
51 Type::Char => Self::Char,
52 Type::String => Self::String,
53 Type::List(ty) => Self::List(Box::new(ty.into())),
54 Type::Record(ty) => Self::Record(Box::new(ty.into())),
55 Type::Tuple(ty) => Self::Tuple(Box::new(ty.into())),
56 Type::Variant(ty) => Self::Variant(Box::new(ty.into())),
57 Type::Enum(ty) => Self::Enum(Box::new(ty.into())),
58 Type::Option(ty) => Self::Option(Box::new(ty.into())),
59 Type::Result(ty) => Self::Result(Box::new(ty.into())),
60 Type::Flags(ty) => Self::Flags(Box::new(ty.into())),
61 Type::Own(ty) => Self::Own(Box::new(ty.into())),
62 Type::Borrow(ty) => Self::Borrow(Box::new(ty.into())),
63 Type::Future(ty) => Self::Future(Box::new(ty.into())),
64 Type::Stream(ty) => Self::Stream(Box::new(ty.into())),
65 Type::Map(ty) => Self::Map(Box::new(ty.into())),
66 Type::ErrorContext => Self::ErrorContext,
67 }
68 }
69}
70
71#[unsafe(no_mangle)]
72pub extern "C" fn wasmtime_component_valtype_clone(
73 ty: &wasmtime_component_valtype_t,
74 ret: &mut MaybeUninit<wasmtime_component_valtype_t>,
75) {
76 ret.write(ty.clone());
77}
78
79#[unsafe(no_mangle)]
80pub extern "C" fn wasmtime_component_valtype_equal(
81 a: &wasmtime_component_valtype_t,
82 b: &wasmtime_component_valtype_t,
83) -> bool {
84 a == b
85}
86
87#[unsafe(no_mangle)]
88pub unsafe extern "C" fn wasmtime_component_valtype_delete(
89 ret: &mut ManuallyDrop<wasmtime_component_valtype_t>,
90) {
91 unsafe { ManuallyDrop::drop(ret) };
92}
93
94type_wrapper! {
95 #[derive(PartialEq)]
96 pub struct wasmtime_component_list_type_t {
97 pub(crate) ty: List,
98 }
99
100 clone: wasmtime_component_list_type_clone,
101 delete: wasmtime_component_list_type_delete,
102 equal: wasmtime_component_list_type_equal,
103}
104
105#[unsafe(no_mangle)]
106pub extern "C" fn wasmtime_component_list_type_element(
107 ty: &wasmtime_component_list_type_t,
108 type_ret: &mut MaybeUninit<wasmtime_component_valtype_t>,
109) {
110 type_ret.write(ty.ty.ty().into());
111}
112
113type_wrapper! {
114 #[derive(PartialEq)]
115 pub struct wasmtime_component_map_type_t {
116 pub(crate) ty: Map,
117 }
118
119 clone: wasmtime_component_map_type_clone,
120 delete: wasmtime_component_map_type_delete,
121 equal: wasmtime_component_map_type_equal,
122}
123
124#[unsafe(no_mangle)]
125pub extern "C" fn wasmtime_component_map_type_key(
126 ty: &wasmtime_component_map_type_t,
127 type_ret: &mut MaybeUninit<wasmtime_component_valtype_t>,
128) {
129 type_ret.write(ty.ty.key().into());
130}
131
132#[unsafe(no_mangle)]
133pub extern "C" fn wasmtime_component_map_type_value(
134 ty: &wasmtime_component_map_type_t,
135 type_ret: &mut MaybeUninit<wasmtime_component_valtype_t>,
136) {
137 type_ret.write(ty.ty.value().into());
138}
139
140type_wrapper! {
141 #[derive(PartialEq)]
142 pub struct wasmtime_component_record_type_t {
143 pub(crate) ty: Record,
144 }
145 clone: wasmtime_component_record_type_clone,
146 delete: wasmtime_component_record_type_delete,
147 equal: wasmtime_component_record_type_equal,
148}
149
150#[unsafe(no_mangle)]
151pub extern "C" fn wasmtime_component_record_type_field_count(
152 ty: &wasmtime_component_record_type_t,
153) -> usize {
154 ty.ty.fields().len()
155}
156
157#[unsafe(no_mangle)]
158pub extern "C" fn wasmtime_component_record_type_field_nth(
159 ty: &wasmtime_component_record_type_t,
160 nth: usize,
161 name_ret: &mut MaybeUninit<*const u8>,
162 name_len_ret: &mut MaybeUninit<usize>,
163 type_ret: &mut MaybeUninit<wasmtime_component_valtype_t>,
164) -> bool {
165 match ty.ty.fields().nth(nth) {
166 Some(Field { name, ty }) => {
167 let name: &str = name;
168 name_ret.write(name.as_ptr());
169 name_len_ret.write(name.len());
170 type_ret.write(ty.into());
171 true
172 }
173 None => false,
174 }
175}
176
177type_wrapper! {
178 #[derive(PartialEq)]
179 pub struct wasmtime_component_tuple_type_t {
180 pub(crate) ty: Tuple,
181 }
182 clone: wasmtime_component_tuple_type_clone,
183 delete: wasmtime_component_tuple_type_delete,
184 equal: wasmtime_component_tuple_type_equal,
185}
186
187#[unsafe(no_mangle)]
188pub extern "C" fn wasmtime_component_tuple_type_types_count(
189 ty: &wasmtime_component_tuple_type_t,
190) -> usize {
191 ty.ty.types().len()
192}
193
194#[unsafe(no_mangle)]
195pub extern "C" fn wasmtime_component_tuple_type_types_nth(
196 ty: &wasmtime_component_tuple_type_t,
197 nth: usize,
198 type_ret: &mut MaybeUninit<wasmtime_component_valtype_t>,
199) -> bool {
200 match ty.ty.types().nth(nth) {
201 Some(item) => {
202 type_ret.write(item.into());
203 true
204 }
205 None => false,
206 }
207}
208
209type_wrapper! {
210 #[derive(PartialEq)]
211 pub struct wasmtime_component_variant_type_t {
212 pub(crate) ty: Variant,
213 }
214 clone: wasmtime_component_variant_type_clone,
215 delete: wasmtime_component_variant_type_delete,
216 equal: wasmtime_component_variant_type_equal,
217}
218
219#[unsafe(no_mangle)]
220pub extern "C" fn wasmtime_component_variant_type_case_count(
221 ty: &wasmtime_component_variant_type_t,
222) -> usize {
223 ty.ty.cases().len()
224}
225
226#[unsafe(no_mangle)]
227pub extern "C" fn wasmtime_component_variant_type_case_nth(
228 ty: &wasmtime_component_variant_type_t,
229 nth: usize,
230 name_ret: &mut MaybeUninit<*const u8>,
231 name_len_ret: &mut MaybeUninit<usize>,
232 has_payload_ret: &mut MaybeUninit<bool>,
233 payload_ret: &mut MaybeUninit<wasmtime_component_valtype_t>,
234) -> bool {
235 match ty.ty.cases().nth(nth) {
236 Some(Case { name, ty }) => {
237 let name: &str = name;
238 name_ret.write(name.as_ptr());
239 name_len_ret.write(name.len());
240 match ty {
241 Some(payload) => {
242 has_payload_ret.write(true);
243 payload_ret.write(payload.into());
244 }
245 None => {
246 has_payload_ret.write(false);
247 }
248 }
249 true
250 }
251 None => false,
252 }
253}
254
255type_wrapper! {
256 #[derive(PartialEq)]
257 pub struct wasmtime_component_enum_type_t {
258 pub(crate) ty: Enum,
259 }
260 clone: wasmtime_component_enum_type_clone,
261 delete: wasmtime_component_enum_type_delete,
262 equal: wasmtime_component_enum_type_equal,
263}
264
265#[unsafe(no_mangle)]
266pub extern "C" fn wasmtime_component_enum_type_names_count(
267 ty: &wasmtime_component_enum_type_t,
268) -> usize {
269 ty.ty.names().len()
270}
271
272#[unsafe(no_mangle)]
273pub extern "C" fn wasmtime_component_enum_type_names_nth(
274 ty: &wasmtime_component_enum_type_t,
275 nth: usize,
276 name_ret: &mut MaybeUninit<*const u8>,
277 name_len_ret: &mut MaybeUninit<usize>,
278) -> bool {
279 match ty.ty.names().nth(nth) {
280 Some(name) => {
281 let name: &str = name;
282 name_ret.write(name.as_ptr());
283 name_len_ret.write(name.len());
284 true
285 }
286 None => false,
287 }
288}
289
290type_wrapper! {
291 #[derive(PartialEq)]
292 pub struct wasmtime_component_option_type_t {
293 pub(crate) ty: OptionType,
294 }
295 clone: wasmtime_component_option_type_clone,
296 delete: wasmtime_component_option_type_delete,
297 equal: wasmtime_component_option_type_equal,
298}
299
300#[unsafe(no_mangle)]
301pub extern "C" fn wasmtime_component_option_type_ty(
302 ty: &wasmtime_component_option_type_t,
303 ret: &mut MaybeUninit<wasmtime_component_valtype_t>,
304) {
305 ret.write(ty.ty.ty().into());
306}
307
308type_wrapper! {
309 #[derive(PartialEq)]
310 pub struct wasmtime_component_result_type_t {
311 pub(crate) ty: ResultType,
312 }
313 clone: wasmtime_component_result_type_clone,
314 delete: wasmtime_component_result_type_delete,
315 equal: wasmtime_component_result_type_equal,
316}
317
318#[unsafe(no_mangle)]
319pub extern "C" fn wasmtime_component_result_type_ok(
320 ty: &wasmtime_component_result_type_t,
321 ret: &mut MaybeUninit<wasmtime_component_valtype_t>,
322) -> bool {
323 match ty.ty.ok() {
324 Some(ok) => {
325 ret.write(ok.into());
326 true
327 }
328 None => false,
329 }
330}
331
332#[unsafe(no_mangle)]
333pub extern "C" fn wasmtime_component_result_type_err(
334 ty: &wasmtime_component_result_type_t,
335 ret: &mut MaybeUninit<wasmtime_component_valtype_t>,
336) -> bool {
337 match ty.ty.err() {
338 Some(err) => {
339 ret.write(err.into());
340 true
341 }
342 None => false,
343 }
344}
345
346type_wrapper! {
347 #[derive(PartialEq)]
348 pub struct wasmtime_component_flags_type_t {
349 pub(crate) ty: Flags,
350 }
351 clone: wasmtime_component_flags_type_clone,
352 delete: wasmtime_component_flags_type_delete,
353 equal: wasmtime_component_flags_type_equal,
354}
355
356#[unsafe(no_mangle)]
357pub extern "C" fn wasmtime_component_flags_type_names_count(
358 ty: &wasmtime_component_flags_type_t,
359) -> usize {
360 ty.ty.names().len()
361}
362
363#[unsafe(no_mangle)]
364pub extern "C" fn wasmtime_component_flags_type_names_nth(
365 ty: &wasmtime_component_flags_type_t,
366 nth: usize,
367 name_ret: &mut MaybeUninit<*const u8>,
368 name_len_ret: &mut MaybeUninit<usize>,
369) -> bool {
370 match ty.ty.names().nth(nth) {
371 Some(name) => {
372 let name: &str = name;
373 name_ret.write(name.as_ptr());
374 name_len_ret.write(name.len());
375 true
376 }
377 None => false,
378 }
379}
380
381type_wrapper! {
382 #[derive(PartialEq)]
383 pub struct wasmtime_component_future_type_t {
384 pub(crate) ty: FutureType,
385 }
386 clone: wasmtime_component_future_type_clone,
387 delete: wasmtime_component_future_type_delete,
388 equal: wasmtime_component_future_type_equal,
389}
390
391#[unsafe(no_mangle)]
392pub extern "C" fn wasmtime_component_future_type_ty(
393 ty: &wasmtime_component_future_type_t,
394 ret: &mut MaybeUninit<wasmtime_component_valtype_t>,
395) -> bool {
396 match ty.ty.ty() {
397 Some(ty) => {
398 ret.write(ty.into());
399 true
400 }
401 None => false,
402 }
403}
404
405type_wrapper! {
406 #[derive(PartialEq)]
407 pub struct wasmtime_component_stream_type_t {
408 pub(crate) ty: StreamType,
409 }
410 clone: wasmtime_component_stream_type_clone,
411 delete: wasmtime_component_stream_type_delete,
412 equal: wasmtime_component_stream_type_equal,
413}
414
415#[unsafe(no_mangle)]
416pub extern "C" fn wasmtime_component_stream_type_ty(
417 ty: &wasmtime_component_stream_type_t,
418 ret: &mut MaybeUninit<wasmtime_component_valtype_t>,
419) -> bool {
420 match ty.ty.ty() {
421 Some(ty) => {
422 ret.write(ty.into());
423 true
424 }
425 None => false,
426 }
427}