Skip to main content

wasmtime_c_api/component/
component.rs

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