Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/c-api/src/component/val.rs
1692 views
1
use wasmtime::component::Val;
2
3
use crate::wasm_name_t;
4
5
use std::mem;
6
use std::mem::MaybeUninit;
7
use std::ptr;
8
use std::slice;
9
10
crate::declare_vecs! {
11
(
12
name: wasmtime_component_vallist_t,
13
ty: wasmtime_component_val_t,
14
new: wasmtime_component_vallist_new,
15
empty: wasmtime_component_vallist_new_empty,
16
uninit: wasmtime_component_vallist_new_uninit,
17
copy: wasmtime_component_vallist_copy,
18
delete: wasmtime_component_vallist_delete,
19
)
20
(
21
name: wasmtime_component_valrecord_t,
22
ty: wasmtime_component_valrecord_entry_t,
23
new: wasmtime_component_valrecord_new,
24
empty: wasmtime_component_valrecord_new_empty,
25
uninit: wasmtime_component_valrecord_new_uninit,
26
copy: wasmtime_component_valrecord_copy,
27
delete: wasmtime_component_valrecord_delete,
28
)
29
(
30
name: wasmtime_component_valtuple_t,
31
ty: wasmtime_component_val_t,
32
new: wasmtime_component_valtuple_new,
33
empty: wasmtime_component_valtuple_new_empty,
34
uninit: wasmtime_component_valtuple_new_uninit,
35
copy: wasmtime_component_valtuple_copy,
36
delete: wasmtime_component_valtuple_delete,
37
)
38
(
39
name: wasmtime_component_valflags_t,
40
ty: wasm_name_t,
41
new: wasmtime_component_valflags_new,
42
empty: wasmtime_component_valflags_new_empty,
43
uninit: wasmtime_component_valflags_new_uninit,
44
copy: wasmtime_component_valflags_copy,
45
delete: wasmtime_component_valflags_delete,
46
)
47
}
48
49
impl From<&wasmtime_component_vallist_t> for Vec<Val> {
50
fn from(value: &wasmtime_component_vallist_t) -> Self {
51
value.as_slice().iter().map(Val::from).collect()
52
}
53
}
54
55
impl From<&[Val]> for wasmtime_component_vallist_t {
56
fn from(value: &[Val]) -> Self {
57
value
58
.iter()
59
.map(wasmtime_component_val_t::from)
60
.collect::<Vec<_>>()
61
.into()
62
}
63
}
64
65
#[derive(Clone)]
66
#[repr(C)]
67
pub struct wasmtime_component_valrecord_entry_t {
68
name: wasm_name_t,
69
val: wasmtime_component_val_t,
70
}
71
72
impl Default for wasmtime_component_valrecord_entry_t {
73
fn default() -> Self {
74
Self {
75
name: wasm_name_t::from_name(String::new()),
76
val: Default::default(),
77
}
78
}
79
}
80
81
impl From<&wasmtime_component_valrecord_entry_t> for (String, Val) {
82
fn from(value: &wasmtime_component_valrecord_entry_t) -> Self {
83
(
84
String::from_utf8(value.name.clone().take()).unwrap(),
85
Val::from(&value.val),
86
)
87
}
88
}
89
90
impl From<&(String, Val)> for wasmtime_component_valrecord_entry_t {
91
fn from((name, val): &(String, Val)) -> Self {
92
Self {
93
name: wasm_name_t::from_name(name.clone()),
94
val: wasmtime_component_val_t::from(val),
95
}
96
}
97
}
98
99
impl From<&wasmtime_component_valrecord_t> for Vec<(String, Val)> {
100
fn from(value: &wasmtime_component_valrecord_t) -> Self {
101
value.as_slice().iter().map(Into::into).collect()
102
}
103
}
104
105
impl From<&[(String, Val)]> for wasmtime_component_valrecord_t {
106
fn from(value: &[(String, Val)]) -> Self {
107
value
108
.iter()
109
.map(wasmtime_component_valrecord_entry_t::from)
110
.collect::<Vec<_>>()
111
.into()
112
}
113
}
114
115
impl From<&wasmtime_component_valtuple_t> for Vec<Val> {
116
fn from(value: &wasmtime_component_valtuple_t) -> Self {
117
value.as_slice().iter().map(Val::from).collect()
118
}
119
}
120
121
impl From<&[Val]> for wasmtime_component_valtuple_t {
122
fn from(value: &[Val]) -> Self {
123
value
124
.iter()
125
.map(wasmtime_component_val_t::from)
126
.collect::<Vec<_>>()
127
.into()
128
}
129
}
130
131
impl From<&wasmtime_component_valflags_t> for Vec<String> {
132
fn from(value: &wasmtime_component_valflags_t) -> Self {
133
value
134
.clone()
135
.take()
136
.into_iter()
137
.map(|mut x| String::from_utf8(x.take()))
138
.collect::<Result<Vec<_>, _>>()
139
.unwrap()
140
}
141
}
142
143
impl From<&[String]> for wasmtime_component_valflags_t {
144
fn from(value: &[String]) -> Self {
145
value
146
.iter()
147
.map(|x| wasm_name_t::from_name(x.clone()))
148
.collect::<Vec<_>>()
149
.into()
150
}
151
}
152
153
#[repr(C)]
154
#[derive(Clone)]
155
pub struct wasmtime_component_valvariant_t {
156
discriminant: wasm_name_t,
157
val: Option<Box<wasmtime_component_val_t>>,
158
}
159
160
impl From<(&String, &Option<Box<Val>>)> for wasmtime_component_valvariant_t {
161
fn from((discriminant, value): (&String, &Option<Box<Val>>)) -> Self {
162
Self {
163
discriminant: wasm_name_t::from_name(discriminant.clone()),
164
val: value
165
.as_ref()
166
.map(|x| Box::new(wasmtime_component_val_t::from(x.as_ref()))),
167
}
168
}
169
}
170
171
impl From<&wasmtime_component_valvariant_t> for (String, Option<Box<Val>>) {
172
fn from(value: &wasmtime_component_valvariant_t) -> Self {
173
(
174
String::from_utf8(value.discriminant.clone().take()).unwrap(),
175
value.val.as_ref().map(|x| Box::new(Val::from(x.as_ref()))),
176
)
177
}
178
}
179
180
#[repr(C)]
181
#[derive(Clone)]
182
pub struct wasmtime_component_valresult_t {
183
is_ok: bool,
184
val: Option<Box<wasmtime_component_val_t>>,
185
}
186
187
impl From<&wasmtime_component_valresult_t> for Result<Option<Box<Val>>, Option<Box<Val>>> {
188
fn from(value: &wasmtime_component_valresult_t) -> Self {
189
let val = value.val.as_ref().map(|x| Box::new(Val::from(x.as_ref())));
190
191
match value.is_ok {
192
true => Ok(val),
193
false => Err(val),
194
}
195
}
196
}
197
198
impl From<&Result<Option<Box<Val>>, Option<Box<Val>>>> for wasmtime_component_valresult_t {
199
fn from(value: &Result<Option<Box<Val>>, Option<Box<Val>>>) -> Self {
200
let (Ok(x) | Err(x)) = value;
201
202
Self {
203
is_ok: value.is_ok(),
204
val: x
205
.as_ref()
206
.map(|x| Box::new(wasmtime_component_val_t::from(x.as_ref()))),
207
}
208
}
209
}
210
211
#[repr(C, u8)]
212
#[derive(Clone)]
213
pub enum wasmtime_component_val_t {
214
Bool(bool),
215
S8(i8),
216
U8(u8),
217
S16(i16),
218
U16(u16),
219
S32(i32),
220
U32(u32),
221
S64(i64),
222
U64(u64),
223
F32(f32),
224
F64(f64),
225
Char(u32),
226
String(wasm_name_t),
227
List(wasmtime_component_vallist_t),
228
Record(wasmtime_component_valrecord_t),
229
Tuple(wasmtime_component_valtuple_t),
230
Variant(wasmtime_component_valvariant_t),
231
Enum(wasm_name_t),
232
Option(Option<Box<Self>>),
233
Result(wasmtime_component_valresult_t),
234
Flags(wasmtime_component_valflags_t),
235
}
236
237
impl Default for wasmtime_component_val_t {
238
fn default() -> Self {
239
Self::Bool(false)
240
}
241
}
242
243
impl From<&wasmtime_component_val_t> for Val {
244
fn from(value: &wasmtime_component_val_t) -> Self {
245
match value {
246
wasmtime_component_val_t::Bool(x) => Val::Bool(*x),
247
wasmtime_component_val_t::S8(x) => Val::S8(*x),
248
wasmtime_component_val_t::U8(x) => Val::U8(*x),
249
wasmtime_component_val_t::S16(x) => Val::S16(*x),
250
wasmtime_component_val_t::U16(x) => Val::U16(*x),
251
wasmtime_component_val_t::S32(x) => Val::S32(*x),
252
wasmtime_component_val_t::U32(x) => Val::U32(*x),
253
wasmtime_component_val_t::S64(x) => Val::S64(*x),
254
wasmtime_component_val_t::U64(x) => Val::U64(*x),
255
wasmtime_component_val_t::F32(x) => Val::Float32(*x),
256
wasmtime_component_val_t::F64(x) => Val::Float64(*x),
257
wasmtime_component_val_t::Char(x) => Val::Char(char::from_u32(*x).unwrap()),
258
wasmtime_component_val_t::String(x) => {
259
Val::String(String::from_utf8(x.clone().take()).unwrap())
260
}
261
wasmtime_component_val_t::List(x) => Val::List(x.into()),
262
wasmtime_component_val_t::Record(x) => Val::Record(x.into()),
263
wasmtime_component_val_t::Tuple(x) => Val::Tuple(x.into()),
264
wasmtime_component_val_t::Variant(x) => {
265
let (a, b) = x.into();
266
Val::Variant(a, b)
267
}
268
wasmtime_component_val_t::Enum(x) => {
269
Val::Enum(String::from_utf8(x.clone().take()).unwrap())
270
}
271
wasmtime_component_val_t::Option(x) => {
272
Val::Option(x.as_ref().map(|x| Box::new(Val::from(x.as_ref()))))
273
}
274
wasmtime_component_val_t::Result(x) => Val::Result(x.into()),
275
wasmtime_component_val_t::Flags(x) => Val::Flags(x.into()),
276
}
277
}
278
}
279
280
impl From<&Val> for wasmtime_component_val_t {
281
fn from(value: &Val) -> Self {
282
match value {
283
Val::Bool(x) => wasmtime_component_val_t::Bool(*x),
284
Val::S8(x) => wasmtime_component_val_t::S8(*x),
285
Val::U8(x) => wasmtime_component_val_t::U8(*x),
286
Val::S16(x) => wasmtime_component_val_t::S16(*x),
287
Val::U16(x) => wasmtime_component_val_t::U16(*x),
288
Val::S32(x) => wasmtime_component_val_t::S32(*x),
289
Val::U32(x) => wasmtime_component_val_t::U32(*x),
290
Val::S64(x) => wasmtime_component_val_t::S64(*x),
291
Val::U64(x) => wasmtime_component_val_t::U64(*x),
292
Val::Float32(x) => wasmtime_component_val_t::F32(*x),
293
Val::Float64(x) => wasmtime_component_val_t::F64(*x),
294
Val::Char(x) => wasmtime_component_val_t::Char(*x as _),
295
Val::String(x) => wasmtime_component_val_t::String(wasm_name_t::from_name(x.clone())),
296
Val::List(x) => wasmtime_component_val_t::List(x.as_slice().into()),
297
Val::Record(x) => wasmtime_component_val_t::Record(x.as_slice().into()),
298
Val::Tuple(x) => wasmtime_component_val_t::Tuple(x.as_slice().into()),
299
Val::Variant(discriminant, val) => {
300
wasmtime_component_val_t::Variant((discriminant, val).into())
301
}
302
Val::Enum(x) => wasmtime_component_val_t::Enum(wasm_name_t::from_name(x.clone())),
303
Val::Option(x) => wasmtime_component_val_t::Option(
304
x.as_ref()
305
.map(|x| Box::new(wasmtime_component_val_t::from(x.as_ref()))),
306
),
307
Val::Result(x) => wasmtime_component_val_t::Result(x.into()),
308
Val::Flags(x) => wasmtime_component_val_t::Flags(x.as_slice().into()),
309
Val::Resource(_resource_any) => todo!(),
310
Val::Future(_) => todo!(),
311
Val::Stream(_) => todo!(),
312
Val::ErrorContext(_) => todo!(),
313
}
314
}
315
}
316
317
#[unsafe(no_mangle)]
318
pub unsafe extern "C" fn wasmtime_component_val_new() -> Box<wasmtime_component_val_t> {
319
Box::new(wasmtime_component_val_t::default())
320
}
321
322
#[unsafe(no_mangle)]
323
pub unsafe extern "C" fn wasmtime_component_val_delete(value: *mut wasmtime_component_val_t) {
324
unsafe {
325
std::ptr::drop_in_place(value);
326
}
327
}
328
329