wasmtime_c_api/component/
component.rs

1use crate::{
2    wasm_byte_vec_t, wasm_config_t, wasm_engine_t, wasmtime_component_type_t, wasmtime_error_t,
3};
4use anyhow::Context;
5use std::ffi::{CStr, c_char};
6use wasmtime::component::{Component, ComponentExportIndex};
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#[derive(Clone)]
14#[repr(transparent)]
15pub struct wasmtime_component_t {
16    pub(crate) component: Component,
17}
18
19#[unsafe(no_mangle)]
20#[cfg(any(feature = "cranelift", feature = "winch"))]
21pub unsafe extern "C" fn wasmtime_component_new(
22    engine: &wasm_engine_t,
23    buf: *const u8,
24    len: usize,
25    component_out: &mut *mut wasmtime_component_t,
26) -> Option<Box<wasmtime_error_t>> {
27    let bytes = unsafe { crate::slice_from_raw_parts(buf, len) };
28    crate::handle_result(Component::new(&engine.engine, bytes), |component| {
29        *component_out = Box::into_raw(Box::new(wasmtime_component_t { component }));
30    })
31}
32
33#[unsafe(no_mangle)]
34#[cfg(any(feature = "cranelift", feature = "winch"))]
35pub extern "C" fn wasmtime_component_serialize(
36    component: &wasmtime_component_t,
37    ret: &mut wasm_byte_vec_t,
38) -> Option<Box<wasmtime_error_t>> {
39    crate::handle_result(component.component.serialize(), |buffer| {
40        ret.set_buffer(buffer);
41    })
42}
43
44#[unsafe(no_mangle)]
45pub unsafe extern "C" fn wasmtime_component_deserialize(
46    engine: &wasm_engine_t,
47    buf: *const u8,
48    len: usize,
49    component_out: &mut *mut wasmtime_component_t,
50) -> Option<Box<wasmtime_error_t>> {
51    let binary = unsafe { crate::slice_from_raw_parts(buf, len) };
52    crate::handle_result(
53        unsafe { Component::deserialize(&engine.engine, binary) },
54        |component| {
55            *component_out = Box::into_raw(Box::new(wasmtime_component_t { component }));
56        },
57    )
58}
59
60#[unsafe(no_mangle)]
61pub unsafe extern "C" fn wasmtime_component_deserialize_file(
62    engine: &wasm_engine_t,
63    path: *const c_char,
64    component_out: &mut *mut wasmtime_component_t,
65) -> Option<Box<wasmtime_error_t>> {
66    let path = unsafe { CStr::from_ptr(path) };
67    let result = path
68        .to_str()
69        .context("input path is not valid utf-8")
70        .and_then(|path| unsafe { Component::deserialize_file(&engine.engine, path) });
71    crate::handle_result(result, |component| {
72        *component_out = Box::into_raw(Box::new(wasmtime_component_t { component }));
73    })
74}
75
76#[unsafe(no_mangle)]
77pub extern "C" fn wasmtime_component_type(
78    component: &wasmtime_component_t,
79) -> Box<wasmtime_component_type_t> {
80    Box::new(component.component.component_type().into())
81}
82
83#[unsafe(no_mangle)]
84pub extern "C" fn wasmtime_component_clone(
85    component: &wasmtime_component_t,
86) -> Box<wasmtime_component_t> {
87    Box::new(component.clone())
88}
89
90#[unsafe(no_mangle)]
91pub extern "C" fn wasmtime_component_delete(_component: Box<wasmtime_component_t>) {}
92
93#[repr(transparent)]
94pub struct wasmtime_component_export_index_t {
95    pub(crate) export_index: ComponentExportIndex,
96}
97
98#[unsafe(no_mangle)]
99pub unsafe extern "C" fn wasmtime_component_get_export_index(
100    component: &wasmtime_component_t,
101    instance_export_index: *const wasmtime_component_export_index_t,
102    name: *const u8,
103    name_len: usize,
104) -> Option<Box<wasmtime_component_export_index_t>> {
105    let name = unsafe { std::slice::from_raw_parts(name, name_len) };
106    let Ok(name) = std::str::from_utf8(name) else {
107        return None;
108    };
109
110    let instance_export_index = if instance_export_index.is_null() {
111        None
112    } else {
113        Some((*instance_export_index).export_index)
114    };
115
116    component
117        .component
118        .get_export_index(instance_export_index.as_ref(), &name)
119        .map(|export_index| Box::new(wasmtime_component_export_index_t { export_index }))
120}
121
122#[unsafe(no_mangle)]
123pub extern "C" fn wasmtime_component_export_index_clone(
124    export_index: &wasmtime_component_export_index_t,
125) -> Box<wasmtime_component_export_index_t> {
126    Box::new(wasmtime_component_export_index_t {
127        export_index: export_index.export_index,
128    })
129}
130
131#[unsafe(no_mangle)]
132pub extern "C" fn wasmtime_component_export_index_delete(
133    _export_index: Box<wasmtime_component_export_index_t>,
134) {
135}