mod atomics_impl;
mod batch_impl;
mod default_impl;
mod resource;
mod store_impl;
mod generated {
pub use self::wasi::keyvalue::store::Error;
pub use super::{BucketProxy, Cas};
wasmtime::component::bindgen!({
world: "imports",
path: "wit",
imports: {
default: store | tracing | trappable,
},
with: {
"wasi:keyvalue/store.bucket": BucketProxy,
"wasi:keyvalue/atomics.cas": Cas,
},
trappable_error_type: {
"wasi:keyvalue/store.error" => Error,
},
});
}
use std::fmt::Debug;
use std::sync::Arc;
pub use omnia::FutureResult;
use omnia::{Host, Server, State};
use wasmtime::component::{HasData, Linker, ResourceTableError};
use wasmtime_wasi::ResourceTable;
pub use self::default_impl::KeyValueDefault;
use self::generated::wasi::keyvalue::store::Error;
use self::generated::wasi::keyvalue::{atomics, batch, store};
pub use self::resource::*;
pub type Result<T, E = Error> = anyhow::Result<T, E>;
#[derive(Debug)]
pub struct WasiKeyValue;
impl HasData for WasiKeyValue {
type Data<'a> = WasiKeyValueCtxView<'a>;
}
impl<T> Host<T> for WasiKeyValue
where
T: WasiKeyValueView + 'static,
{
fn add_to_linker(linker: &mut Linker<T>) -> anyhow::Result<()> {
store::add_to_linker::<_, Self>(linker, T::keyvalue)?;
atomics::add_to_linker::<_, Self>(linker, T::keyvalue)?;
Ok(batch::add_to_linker::<_, Self>(linker, T::keyvalue)?)
}
}
impl<S> Server<S> for WasiKeyValue where S: State {}
pub trait WasiKeyValueView: Send {
fn keyvalue(&mut self) -> WasiKeyValueCtxView<'_>;
}
pub struct WasiKeyValueCtxView<'a> {
pub ctx: &'a mut dyn WasiKeyValueCtx,
pub table: &'a mut ResourceTable,
}
pub trait WasiKeyValueCtx: Debug + Send + Sync + 'static {
fn open_bucket(&self, identifier: String) -> FutureResult<Arc<dyn Bucket>>;
}
impl From<anyhow::Error> for Error {
fn from(err: anyhow::Error) -> Self {
Self::Other(err.to_string())
}
}
impl From<ResourceTableError> for Error {
fn from(err: ResourceTableError) -> Self {
Self::Other(err.to_string())
}
}
#[macro_export]
macro_rules! omnia_wasi_view {
($store_ctx:ty, $field_name:ident) => {
impl omnia_wasi_keyvalue::WasiKeyValueView for $store_ctx {
fn keyvalue(&mut self) -> omnia_wasi_keyvalue::WasiKeyValueCtxView<'_> {
omnia_wasi_keyvalue::WasiKeyValueCtxView {
ctx: &mut self.$field_name,
table: &mut self.table,
}
}
}
};
}