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)]
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}