pub mod default_impl;
mod readwrite_impl;
mod resource;
mod types_impl;
mod generated {
#![allow(missing_docs)]
pub use anyhow::Error;
pub use super::{ConnectionProxy, Statement};
wasmtime::component::bindgen!({
world: "sql",
path: "wit",
imports: {
default: store | tracing | trappable,
},
with: {
"wasi:sql/types.connection": ConnectionProxy,
"wasi:sql/types.statement": Statement,
"wasi:sql/types.error": Error,
},
trappable_error_type: {
"wasi:sql/types.error" => Error,
},
});
}
use std::fmt::Debug;
use std::sync::Arc;
pub use omnia::FutureResult;
use omnia::{Host, Server, State};
use wasmtime::component::{HasData, Linker};
use wasmtime_wasi::ResourceTable;
use self::generated::wasi::sql::{readwrite, types};
pub use crate::host::default_impl::SqlDefault;
pub use crate::host::generated::wasi::sql::types::{DataType, Field, Row};
pub use crate::host::resource::*;
#[derive(Debug)]
pub struct WasiSql;
impl HasData for WasiSql {
type Data<'a> = WasiSqlCtxView<'a>;
}
impl<T> Host<T> for WasiSql
where
T: WasiSqlView + 'static,
{
fn add_to_linker(linker: &mut Linker<T>) -> anyhow::Result<()> {
readwrite::add_to_linker::<_, Self>(linker, T::sql)?;
Ok(types::add_to_linker::<_, Self>(linker, T::sql)?)
}
}
impl<S> Server<S> for WasiSql where S: State {}
pub trait WasiSqlView: Send {
fn sql(&mut self) -> WasiSqlCtxView<'_>;
}
pub struct WasiSqlCtxView<'a> {
pub ctx: &'a mut dyn WasiSqlCtx,
pub table: &'a mut ResourceTable,
}
pub trait WasiSqlCtx: Debug + Send + Sync + 'static {
fn open(&self, name: String) -> FutureResult<Arc<dyn Connection>>;
}
#[macro_export]
macro_rules! omnia_wasi_view {
($store_ctx:ty, $field_name:ident) => {
impl omnia_wasi_sql::WasiSqlView for $store_ctx {
fn sql(&mut self) -> omnia_wasi_sql::WasiSqlCtxView<'_> {
omnia_wasi_sql::WasiSqlCtxView {
ctx: &mut self.$field_name,
table: &mut self.table,
}
}
}
};
}