Path: blob/main/crates/c-api/src/component/val.rs
3068 views
use crate::{1WasmtimeStoreContextMut, handle_result, wasm_name_t, wasmtime_component_resource_type_t,2wasmtime_error_t,3};4use std::mem;5use std::mem::{ManuallyDrop, MaybeUninit};6use std::ptr;7use std::slice;8use wasmtime::component::{ResourceAny, ResourceDynamic, Val};910crate::declare_vecs! {11(12name: wasmtime_component_vallist_t,13ty: wasmtime_component_val_t,14new: wasmtime_component_vallist_new,15empty: wasmtime_component_vallist_new_empty,16uninit: wasmtime_component_vallist_new_uninit,17copy: wasmtime_component_vallist_copy,18delete: wasmtime_component_vallist_delete,19)20(21name: wasmtime_component_valrecord_t,22ty: wasmtime_component_valrecord_entry_t,23new: wasmtime_component_valrecord_new,24empty: wasmtime_component_valrecord_new_empty,25uninit: wasmtime_component_valrecord_new_uninit,26copy: wasmtime_component_valrecord_copy,27delete: wasmtime_component_valrecord_delete,28)29(30name: wasmtime_component_valtuple_t,31ty: wasmtime_component_val_t,32new: wasmtime_component_valtuple_new,33empty: wasmtime_component_valtuple_new_empty,34uninit: wasmtime_component_valtuple_new_uninit,35copy: wasmtime_component_valtuple_copy,36delete: wasmtime_component_valtuple_delete,37)38(39name: wasmtime_component_valflags_t,40ty: wasm_name_t,41new: wasmtime_component_valflags_new,42empty: wasmtime_component_valflags_new_empty,43uninit: wasmtime_component_valflags_new_uninit,44copy: wasmtime_component_valflags_copy,45delete: wasmtime_component_valflags_delete,46)47}4849impl From<&wasmtime_component_vallist_t> for Vec<Val> {50fn from(value: &wasmtime_component_vallist_t) -> Self {51value.as_slice().iter().map(Val::from).collect()52}53}5455impl From<&[Val]> for wasmtime_component_vallist_t {56fn from(value: &[Val]) -> Self {57value58.iter()59.map(wasmtime_component_val_t::from)60.collect::<Vec<_>>()61.into()62}63}6465#[derive(Clone)]66#[repr(C)]67pub struct wasmtime_component_valrecord_entry_t {68name: wasm_name_t,69val: wasmtime_component_val_t,70}7172impl Default for wasmtime_component_valrecord_entry_t {73fn default() -> Self {74Self {75name: wasm_name_t::from_name(String::new()),76val: Default::default(),77}78}79}8081impl From<&wasmtime_component_valrecord_entry_t> for (String, Val) {82fn from(value: &wasmtime_component_valrecord_entry_t) -> Self {83(84String::from_utf8(value.name.clone().take()).unwrap(),85Val::from(&value.val),86)87}88}8990impl From<&(String, Val)> for wasmtime_component_valrecord_entry_t {91fn from((name, val): &(String, Val)) -> Self {92Self {93name: wasm_name_t::from_name(name.clone()),94val: wasmtime_component_val_t::from(val),95}96}97}9899impl From<&wasmtime_component_valrecord_t> for Vec<(String, Val)> {100fn from(value: &wasmtime_component_valrecord_t) -> Self {101value.as_slice().iter().map(Into::into).collect()102}103}104105impl From<&[(String, Val)]> for wasmtime_component_valrecord_t {106fn from(value: &[(String, Val)]) -> Self {107value108.iter()109.map(wasmtime_component_valrecord_entry_t::from)110.collect::<Vec<_>>()111.into()112}113}114115impl From<&wasmtime_component_valtuple_t> for Vec<Val> {116fn from(value: &wasmtime_component_valtuple_t) -> Self {117value.as_slice().iter().map(Val::from).collect()118}119}120121impl From<&[Val]> for wasmtime_component_valtuple_t {122fn from(value: &[Val]) -> Self {123value124.iter()125.map(wasmtime_component_val_t::from)126.collect::<Vec<_>>()127.into()128}129}130131impl From<&wasmtime_component_valflags_t> for Vec<String> {132fn from(value: &wasmtime_component_valflags_t) -> Self {133value134.clone()135.take()136.into_iter()137.map(|mut x| String::from_utf8(x.take()))138.collect::<Result<Vec<_>, _>>()139.unwrap()140}141}142143impl From<&[String]> for wasmtime_component_valflags_t {144fn from(value: &[String]) -> Self {145value146.iter()147.map(|x| wasm_name_t::from_name(x.clone()))148.collect::<Vec<_>>()149.into()150}151}152153#[repr(C)]154#[derive(Clone)]155pub struct wasmtime_component_valvariant_t {156discriminant: wasm_name_t,157val: Option<Box<wasmtime_component_val_t>>,158}159160impl From<(&String, &Option<Box<Val>>)> for wasmtime_component_valvariant_t {161fn from((discriminant, value): (&String, &Option<Box<Val>>)) -> Self {162Self {163discriminant: wasm_name_t::from_name(discriminant.clone()),164val: value165.as_ref()166.map(|x| Box::new(wasmtime_component_val_t::from(x.as_ref()))),167}168}169}170171impl From<&wasmtime_component_valvariant_t> for (String, Option<Box<Val>>) {172fn from(value: &wasmtime_component_valvariant_t) -> Self {173(174String::from_utf8(value.discriminant.clone().take()).unwrap(),175value.val.as_ref().map(|x| Box::new(Val::from(x.as_ref()))),176)177}178}179180#[repr(C)]181#[derive(Clone)]182pub struct wasmtime_component_valresult_t {183is_ok: bool,184val: Option<Box<wasmtime_component_val_t>>,185}186187impl From<&wasmtime_component_valresult_t> for Result<Option<Box<Val>>, Option<Box<Val>>> {188fn from(value: &wasmtime_component_valresult_t) -> Self {189let val = value.val.as_ref().map(|x| Box::new(Val::from(x.as_ref())));190191match value.is_ok {192true => Ok(val),193false => Err(val),194}195}196}197198impl From<&Result<Option<Box<Val>>, Option<Box<Val>>>> for wasmtime_component_valresult_t {199fn from(value: &Result<Option<Box<Val>>, Option<Box<Val>>>) -> Self {200let (Ok(x) | Err(x)) = value;201202Self {203is_ok: value.is_ok(),204val: x205.as_ref()206.map(|x| Box::new(wasmtime_component_val_t::from(x.as_ref()))),207}208}209}210211#[repr(C, u8)]212#[derive(Clone)]213pub enum wasmtime_component_val_t {214Bool(bool),215S8(i8),216U8(u8),217S16(i16),218U16(u16),219S32(i32),220U32(u32),221S64(i64),222U64(u64),223F32(f32),224F64(f64),225Char(u32),226String(wasm_name_t),227List(wasmtime_component_vallist_t),228Record(wasmtime_component_valrecord_t),229Tuple(wasmtime_component_valtuple_t),230Variant(wasmtime_component_valvariant_t),231Enum(wasm_name_t),232Option(Option<Box<Self>>),233Result(wasmtime_component_valresult_t),234Flags(wasmtime_component_valflags_t),235Resource(Box<wasmtime_component_resource_any_t>),236}237238impl Default for wasmtime_component_val_t {239fn default() -> Self {240Self::Bool(false)241}242}243244impl From<&wasmtime_component_val_t> for Val {245fn from(value: &wasmtime_component_val_t) -> Self {246match value {247wasmtime_component_val_t::Bool(x) => Val::Bool(*x),248wasmtime_component_val_t::S8(x) => Val::S8(*x),249wasmtime_component_val_t::U8(x) => Val::U8(*x),250wasmtime_component_val_t::S16(x) => Val::S16(*x),251wasmtime_component_val_t::U16(x) => Val::U16(*x),252wasmtime_component_val_t::S32(x) => Val::S32(*x),253wasmtime_component_val_t::U32(x) => Val::U32(*x),254wasmtime_component_val_t::S64(x) => Val::S64(*x),255wasmtime_component_val_t::U64(x) => Val::U64(*x),256wasmtime_component_val_t::F32(x) => Val::Float32(*x),257wasmtime_component_val_t::F64(x) => Val::Float64(*x),258wasmtime_component_val_t::Char(x) => Val::Char(char::from_u32(*x).unwrap()),259wasmtime_component_val_t::String(x) => {260Val::String(String::from_utf8(x.clone().take()).unwrap())261}262wasmtime_component_val_t::List(x) => Val::List(x.into()),263wasmtime_component_val_t::Record(x) => Val::Record(x.into()),264wasmtime_component_val_t::Tuple(x) => Val::Tuple(x.into()),265wasmtime_component_val_t::Variant(x) => {266let (a, b) = x.into();267Val::Variant(a, b)268}269wasmtime_component_val_t::Enum(x) => {270Val::Enum(String::from_utf8(x.clone().take()).unwrap())271}272wasmtime_component_val_t::Option(x) => {273Val::Option(x.as_ref().map(|x| Box::new(Val::from(x.as_ref()))))274}275wasmtime_component_val_t::Result(x) => Val::Result(x.into()),276wasmtime_component_val_t::Flags(x) => Val::Flags(x.into()),277wasmtime_component_val_t::Resource(x) => Val::Resource(x.resource),278}279}280}281282impl From<&Val> for wasmtime_component_val_t {283fn from(value: &Val) -> Self {284match value {285Val::Bool(x) => wasmtime_component_val_t::Bool(*x),286Val::S8(x) => wasmtime_component_val_t::S8(*x),287Val::U8(x) => wasmtime_component_val_t::U8(*x),288Val::S16(x) => wasmtime_component_val_t::S16(*x),289Val::U16(x) => wasmtime_component_val_t::U16(*x),290Val::S32(x) => wasmtime_component_val_t::S32(*x),291Val::U32(x) => wasmtime_component_val_t::U32(*x),292Val::S64(x) => wasmtime_component_val_t::S64(*x),293Val::U64(x) => wasmtime_component_val_t::U64(*x),294Val::Float32(x) => wasmtime_component_val_t::F32(*x),295Val::Float64(x) => wasmtime_component_val_t::F64(*x),296Val::Char(x) => wasmtime_component_val_t::Char(*x as _),297Val::String(x) => wasmtime_component_val_t::String(wasm_name_t::from_name(x.clone())),298Val::List(x) => wasmtime_component_val_t::List(x.as_slice().into()),299Val::Record(x) => wasmtime_component_val_t::Record(x.as_slice().into()),300Val::Tuple(x) => wasmtime_component_val_t::Tuple(x.as_slice().into()),301Val::Variant(discriminant, val) => {302wasmtime_component_val_t::Variant((discriminant, val).into())303}304Val::Enum(x) => wasmtime_component_val_t::Enum(wasm_name_t::from_name(x.clone())),305Val::Option(x) => wasmtime_component_val_t::Option(306x.as_ref()307.map(|x| Box::new(wasmtime_component_val_t::from(x.as_ref()))),308),309Val::Result(x) => wasmtime_component_val_t::Result(x.into()),310Val::Flags(x) => wasmtime_component_val_t::Flags(x.as_slice().into()),311Val::Resource(resource_any) => {312wasmtime_component_val_t::Resource(Box::new(wasmtime_component_resource_any_t {313resource: *resource_any,314}))315}316Val::Future(_) => todo!(),317Val::Stream(_) => todo!(),318Val::ErrorContext(_) => todo!(),319}320}321}322323#[unsafe(no_mangle)]324pub extern "C" fn wasmtime_component_val_new(325src: &mut wasmtime_component_val_t,326) -> Box<wasmtime_component_val_t> {327Box::new(mem::replace(src, wasmtime_component_val_t::default()))328}329330#[unsafe(no_mangle)]331pub extern "C" fn wasmtime_component_val_free(_dst: Option<Box<wasmtime_component_val_t>>) {}332333#[unsafe(no_mangle)]334pub extern "C" fn wasmtime_component_val_clone(335src: &wasmtime_component_val_t,336dst: &mut MaybeUninit<wasmtime_component_val_t>,337) {338dst.write(src.clone());339}340341#[unsafe(no_mangle)]342pub unsafe extern "C" fn wasmtime_component_val_delete(343value: &mut ManuallyDrop<wasmtime_component_val_t>,344) {345unsafe {346ManuallyDrop::drop(value);347}348}349350#[repr(C)]351#[derive(Clone)]352pub struct wasmtime_component_resource_any_t {353resource: ResourceAny,354}355356#[unsafe(no_mangle)]357pub extern "C" fn wasmtime_component_resource_any_type(358resource: &wasmtime_component_resource_any_t,359) -> Box<wasmtime_component_resource_type_t> {360Box::new(wasmtime_component_resource_type_t {361ty: resource.resource.ty(),362})363}364365#[unsafe(no_mangle)]366pub extern "C" fn wasmtime_component_resource_any_clone(367resource: &wasmtime_component_resource_any_t,368) -> Box<wasmtime_component_resource_any_t> {369Box::new(wasmtime_component_resource_any_t {370resource: resource.resource,371})372}373374#[unsafe(no_mangle)]375pub extern "C" fn wasmtime_component_resource_any_owned(376resource: &wasmtime_component_resource_any_t,377) -> bool {378resource.resource.owned()379}380381#[unsafe(no_mangle)]382pub extern "C" fn wasmtime_component_resource_any_drop(383store: WasmtimeStoreContextMut<'_>,384resource: &wasmtime_component_resource_any_t,385) -> Option<Box<wasmtime_error_t>> {386handle_result(resource.resource.resource_drop(store), |()| ())387}388389#[unsafe(no_mangle)]390pub extern "C" fn wasmtime_component_resource_any_delete(391_resource: Option<Box<wasmtime_component_resource_any_t>>,392) {393}394395#[repr(C)]396pub struct wasmtime_component_resource_host_t {397resource: ResourceDynamic,398}399400impl wasmtime_component_resource_host_t {401// "poor man's clone"402fn resource(&self) -> ResourceDynamic {403let rep = self.resource.rep();404let ty = self.resource.ty();405if self.resource.owned() {406ResourceDynamic::new_own(rep, ty)407} else {408ResourceDynamic::new_borrow(rep, ty)409}410}411}412413#[unsafe(no_mangle)]414pub extern "C" fn wasmtime_component_resource_host_new(415owned: bool,416rep: u32,417ty: u32,418) -> Box<wasmtime_component_resource_host_t> {419Box::new(wasmtime_component_resource_host_t {420resource: if owned {421ResourceDynamic::new_own(rep, ty)422} else {423ResourceDynamic::new_borrow(rep, ty)424},425})426}427428#[unsafe(no_mangle)]429pub extern "C" fn wasmtime_component_resource_host_clone(430resource: &wasmtime_component_resource_host_t,431) -> Box<wasmtime_component_resource_host_t> {432Box::new(wasmtime_component_resource_host_t {433resource: resource.resource(),434})435}436437#[unsafe(no_mangle)]438pub extern "C" fn wasmtime_component_resource_host_rep(439resource: &wasmtime_component_resource_host_t,440) -> u32 {441resource.resource.rep()442}443444#[unsafe(no_mangle)]445pub extern "C" fn wasmtime_component_resource_host_type(446resource: &wasmtime_component_resource_host_t,447) -> u32 {448resource.resource.ty()449}450451#[unsafe(no_mangle)]452pub extern "C" fn wasmtime_component_resource_host_owned(453resource: &wasmtime_component_resource_host_t,454) -> bool {455resource.resource.owned()456}457458#[unsafe(no_mangle)]459pub extern "C" fn wasmtime_component_resource_host_delete(460_resource: Option<Box<wasmtime_component_resource_host_t>>,461) {462}463464#[unsafe(no_mangle)]465pub extern "C" fn wasmtime_component_resource_any_to_host(466store: WasmtimeStoreContextMut<'_>,467resource: &wasmtime_component_resource_any_t,468ret: &mut MaybeUninit<Box<wasmtime_component_resource_host_t>>,469) -> Option<Box<wasmtime_error_t>> {470handle_result(471resource.resource.try_into_resource_dynamic(store),472|resource| {473ret.write(Box::new(wasmtime_component_resource_host_t { resource }));474},475)476}477478#[unsafe(no_mangle)]479pub extern "C" fn wasmtime_component_resource_host_to_any(480store: WasmtimeStoreContextMut<'_>,481resource: &wasmtime_component_resource_host_t,482ret: &mut MaybeUninit<Box<wasmtime_component_resource_any_t>>,483) -> Option<Box<wasmtime_error_t>> {484handle_result(485resource.resource().try_into_resource_any(store),486|resource| {487ret.write(Box::new(wasmtime_component_resource_any_t { resource }));488},489)490}491492493