use super::IValue;
use super::IType;
use crate::HostImportError;
use marine_wasm_backend_traits::WasiParameters;
use marine_wasm_backend_traits::WasmBackend;
use std::path::PathBuf;
use std::collections::HashMap;
use std::collections::HashSet;
use std::sync::Arc;
pub type ErrorHandler =
Option<Box<dyn Fn(&HostImportError) -> Option<IValue> + Sync + Send + 'static>>;
pub type HostExportedFunc<WB> = Box<
dyn for<'c> Fn(&mut <WB as WasmBackend>::ImportCallContext<'c>, Vec<IValue>) -> Option<IValue>
+ Sync
+ Send
+ 'static,
>;
pub type RawImportCreator<WB> =
Arc<dyn Fn(<WB as WasmBackend>::ContextMut<'_>) -> <WB as WasmBackend>::HostFunction>;
pub struct HostImportDescriptor<WB: WasmBackend> {
pub host_exported_func: HostExportedFunc<WB>,
pub argument_types: Vec<IType>,
pub output_type: Option<IType>,
pub error_handler: ErrorHandler,
}
#[derive(Hash, Ord, PartialOrd, Eq, PartialEq)]
pub enum HostAPIVersion {
V0,
V1,
}
impl HostAPIVersion {
pub fn namespace(&self) -> &'static str {
match self {
Self::V0 => "host",
Self::V1 => "__marine_host_api_v1",
}
}
}
pub struct MModuleConfig<WB: WasmBackend> {
pub raw_imports: HashMap<HostAPIVersion, HashMap<String, RawImportCreator<WB>>>,
pub host_imports: HashMap<HostAPIVersion, HashMap<String, HostImportDescriptor<WB>>>,
pub wasi_parameters: WasiParameters,
}
impl<WB: WasmBackend> Default for MModuleConfig<WB> {
fn default() -> Self {
Self {
raw_imports: HashMap::new(),
host_imports: HashMap::new(),
wasi_parameters: WasiParameters::default(),
}
}
}
#[allow(dead_code)]
impl<WB: WasmBackend> MModuleConfig<WB> {
pub fn with_wasi_envs(mut self, envs: HashMap<String, String>) -> Self {
self.wasi_parameters.envs = envs;
self
}
pub fn with_wasi_preopened_files(mut self, preopened_files: HashSet<PathBuf>) -> Self {
self.wasi_parameters.preopened_files = preopened_files;
self
}
pub fn with_wasi_mapped_dirs(mut self, mapped_dirs: HashMap<String, PathBuf>) -> Self {
self.wasi_parameters.mapped_dirs = mapped_dirs;
self
}
}
pub struct MarineCoreConfig {
pub(crate) total_memory_limit: u64,
}
impl Default for MarineCoreConfig {
fn default() -> Self {
Self {
total_memory_limit: INFINITE_MEMORY_LIMIT,
}
}
}
pub const INFINITE_MEMORY_LIMIT: u64 = u64::MAX;
#[derive(Default, Debug)]
pub struct MarineCoreConfigBuilder {
total_memory_limit: Option<u64>,
}
impl MarineCoreConfigBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn total_memory_limit(mut self, total_memory_limit: u64) -> Self {
self.total_memory_limit = Some(total_memory_limit);
self
}
pub fn build(self) -> MarineCoreConfig {
MarineCoreConfig {
total_memory_limit: self.total_memory_limit.unwrap_or(INFINITE_MEMORY_LIMIT),
}
}
}