wasmtime_c_api/component/
component.rs1#[cfg(any(feature = "cranelift", feature = "winch"))]
2use crate::wasm_byte_vec_t;
3use crate::{wasm_config_t, wasm_engine_t, wasmtime_component_type_t, wasmtime_error_t};
4use std::ffi::{CStr, c_char};
5use wasmtime::component::{Component, ComponentExportIndex};
6use wasmtime::error::Context;
7
8#[unsafe(no_mangle)]
9pub extern "C" fn wasmtime_config_wasm_component_model_set(c: &mut wasm_config_t, enable: bool) {
10 c.config.wasm_component_model(enable);
11}
12
13#[unsafe(no_mangle)]
14pub extern "C" fn wasmtime_config_wasm_component_model_map_set(
15 c: &mut wasm_config_t,
16 enable: bool,
17) {
18 c.config.wasm_component_model_map(enable);
19}
20
21#[unsafe(no_mangle)]
22pub extern "C" fn wasmtime_config_wasm_component_model_implements_set(
23 c: &mut wasm_config_t,
24 enable: bool,
25) {
26 c.config.wasm_component_model_implements(enable);
27}
28
29#[unsafe(no_mangle)]
30pub extern "C" fn wasmtime_config_wasm_component_model_canonical_names_set(
31 c: &mut wasm_config_t,
32 enable: bool,
33) {
34 c.config.wasm_component_model_canonical_names(enable);
35}
36
37#[unsafe(no_mangle)]
38pub extern "C" fn wasmtime_config_wasm_component_model_accessors_set(
39 c: &mut wasm_config_t,
40 enable: bool,
41) {
42 c.config.wasm_component_model_accessors(enable);
43}
44
45#[unsafe(no_mangle)]
46#[cfg(feature = "component-model-async")]
47pub extern "C" fn wasmtime_config_wasm_component_model_async_set(
48 c: &mut wasm_config_t,
49 enable: bool,
50) {
51 c.config.wasm_component_model_async(enable);
52}
53
54#[unsafe(no_mangle)]
55#[cfg(feature = "component-model-async")]
56pub extern "C" fn wasmtime_config_wasm_component_model_more_async_builtins_set(
57 c: &mut wasm_config_t,
58 enable: bool,
59) {
60 c.config.wasm_component_model_more_async_builtins(enable);
61}
62
63#[unsafe(no_mangle)]
64#[cfg(feature = "component-model-async")]
65pub extern "C" fn wasmtime_config_wasm_component_model_async_stackful_set(
66 c: &mut wasm_config_t,
67 enable: bool,
68) {
69 c.config.wasm_component_model_async_stackful(enable);
70}
71
72#[derive(Clone)]
73#[repr(transparent)]
74pub struct wasmtime_component_t {
75 pub(crate) component: Component,
76}
77
78#[unsafe(no_mangle)]
79#[cfg(any(feature = "cranelift", feature = "winch"))]
80pub unsafe extern "C" fn wasmtime_component_new(
81 engine: &wasm_engine_t,
82 buf: *const u8,
83 len: usize,
84 component_out: &mut *mut wasmtime_component_t,
85) -> Option<Box<wasmtime_error_t>> {
86 let bytes = unsafe { crate::slice_from_raw_parts(buf, len) };
87 crate::handle_result(Component::new(&engine.engine, bytes), |component| {
88 *component_out = Box::into_raw(Box::new(wasmtime_component_t { component }));
89 })
90}
91
92#[unsafe(no_mangle)]
93#[cfg(any(feature = "cranelift", feature = "winch"))]
94pub extern "C" fn wasmtime_component_serialize(
95 component: &wasmtime_component_t,
96 ret: &mut wasm_byte_vec_t,
97) -> Option<Box<wasmtime_error_t>> {
98 crate::handle_result(component.component.serialize(), |buffer| {
99 ret.set_buffer(buffer);
100 })
101}
102
103#[unsafe(no_mangle)]
104pub unsafe extern "C" fn wasmtime_component_deserialize(
105 engine: &wasm_engine_t,
106 buf: *const u8,
107 len: usize,
108 component_out: &mut *mut wasmtime_component_t,
109) -> Option<Box<wasmtime_error_t>> {
110 let binary = unsafe { crate::slice_from_raw_parts(buf, len) };
111 crate::handle_result(
112 unsafe { Component::deserialize(&engine.engine, binary) },
113 |component| {
114 *component_out = Box::into_raw(Box::new(wasmtime_component_t { component }));
115 },
116 )
117}
118
119#[unsafe(no_mangle)]
120pub unsafe extern "C" fn wasmtime_component_deserialize_file(
121 engine: &wasm_engine_t,
122 path: *const c_char,
123 component_out: &mut *mut wasmtime_component_t,
124) -> Option<Box<wasmtime_error_t>> {
125 let path = unsafe { CStr::from_ptr(path) };
126 let result = path
127 .to_str()
128 .context("input path is not valid utf-8")
129 .and_then(|path| unsafe { Component::deserialize_file(&engine.engine, path) });
130 crate::handle_result(result, |component| {
131 *component_out = Box::into_raw(Box::new(wasmtime_component_t { component }));
132 })
133}
134
135#[unsafe(no_mangle)]
136pub extern "C" fn wasmtime_component_type(
137 component: &wasmtime_component_t,
138) -> Box<wasmtime_component_type_t> {
139 Box::new(component.component.component_type().into())
140}
141
142#[unsafe(no_mangle)]
143pub extern "C" fn wasmtime_component_clone(
144 component: &wasmtime_component_t,
145) -> Box<wasmtime_component_t> {
146 Box::new(component.clone())
147}
148
149#[unsafe(no_mangle)]
150pub extern "C" fn wasmtime_component_delete(_component: Box<wasmtime_component_t>) {}
151
152#[repr(transparent)]
153pub struct wasmtime_component_export_index_t {
154 pub(crate) export_index: ComponentExportIndex,
155}
156
157#[unsafe(no_mangle)]
158pub unsafe extern "C" fn wasmtime_component_get_export_index(
159 component: &wasmtime_component_t,
160 instance_export_index: *const wasmtime_component_export_index_t,
161 name: *const u8,
162 name_len: usize,
163) -> Option<Box<wasmtime_component_export_index_t>> {
164 let name = unsafe { crate::slice_from_raw_parts(name, name_len) };
165 let Ok(name) = std::str::from_utf8(name) else {
166 return None;
167 };
168
169 let instance_export_index = if instance_export_index.is_null() {
170 None
171 } else {
172 Some((*instance_export_index).export_index)
173 };
174
175 component
176 .component
177 .get_export_index(instance_export_index.as_ref(), &name)
178 .map(|export_index| Box::new(wasmtime_component_export_index_t { export_index }))
179}
180
181#[unsafe(no_mangle)]
182pub extern "C" fn wasmtime_component_export_index_clone(
183 export_index: &wasmtime_component_export_index_t,
184) -> Box<wasmtime_component_export_index_t> {
185 Box::new(wasmtime_component_export_index_t {
186 export_index: export_index.export_index,
187 })
188}
189
190#[unsafe(no_mangle)]
191pub extern "C" fn wasmtime_component_export_index_delete(
192 _export_index: Box<wasmtime_component_export_index_t>,
193) {
194}