use crate::collections::{ConstSpan, MutSpan, NonNullConst, Result};
use crate::library::OSPathChar;
use crate::module::module_loader::ModuleLoaderInterface;
use crate::module::{
Error, Interface, InterfaceDescriptor, InternalHandle, LoaderHandle, ModuleHandle, ModuleInfo,
ModuleStatus, ModuleType,
};
use crate::{Bool, CBase, CBaseInterface, TypeWrapper};
use std::ptr::NonNull;
pub type RegisterLoaderFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
loader: NonNullConst<ModuleLoaderInterface>,
mod_type: NonNullConst<ModuleType>,
) -> Result<LoaderHandle, Error>,
>;
pub type UnregisterLoaderFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
loader: LoaderHandle,
) -> Result<i8, Error>,
>;
pub type GetLoaderInterfaceFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
loader: LoaderHandle,
) -> Result<NonNullConst<ModuleLoaderInterface>, Error>,
>;
pub type GetLoaderHandleFromTypeFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
mod_type: NonNullConst<ModuleType>,
) -> Result<LoaderHandle, Error>,
>;
pub type GetLoaderHandleFromModuleFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
handle: ModuleHandle,
) -> Result<LoaderHandle, Error>,
>;
pub type GetNumModulesFn =
TypeWrapper<unsafe extern "C-unwind" fn(base_module: Option<NonNull<CBase>>) -> usize>;
pub type GetNumLoadersFn =
TypeWrapper<unsafe extern "C-unwind" fn(base_module: Option<NonNull<CBase>>) -> usize>;
pub type GetNumExportedInterfacesFn =
TypeWrapper<unsafe extern "C-unwind" fn(base_module: Option<NonNull<CBase>>) -> usize>;
pub type ModuleExistsFn = TypeWrapper<
unsafe extern "C-unwind" fn(base_module: Option<NonNull<CBase>>, handle: ModuleHandle) -> Bool,
>;
pub type TypeExistsFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
mod_type: NonNullConst<ModuleType>,
) -> Bool,
>;
pub type ExportedInterfaceExistsFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
interface: NonNullConst<InterfaceDescriptor>,
) -> Bool,
>;
pub type GetModulesFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
buffer: NonNull<MutSpan<ModuleInfo>>,
) -> Result<usize, Error>,
>;
pub type GetModuleTypesFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
buffer: NonNull<MutSpan<ModuleType>>,
) -> Result<usize, Error>,
>;
pub type GetExportedInterfacesFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
buffer: NonNull<MutSpan<InterfaceDescriptor>>,
) -> Result<usize, Error>,
>;
pub type GetExportedInterfaceHandleFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
interface: NonNullConst<InterfaceDescriptor>,
) -> Result<ModuleHandle, Error>,
>;
pub type CreateModuleHandleFn =
TypeWrapper<unsafe extern "C-unwind" fn(base_module: Option<NonNull<CBase>>) -> ModuleHandle>;
pub type RemoveModuleHandleFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
handle: ModuleHandle,
) -> Result<i8, Error>,
>;
pub type LinkModuleFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
handle: ModuleHandle,
loader: LoaderHandle,
internal: InternalHandle,
) -> Result<i8, Error>,
>;
pub type GetInternalModuleHandleFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
handle: ModuleHandle,
) -> Result<InternalHandle, Error>,
>;
pub type AddModuleFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
loader: LoaderHandle,
path: NonNullConst<OSPathChar>,
) -> Result<ModuleHandle, Error>,
>;
pub type RemoveModuleFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
handle: ModuleHandle,
) -> Result<i8, Error>,
>;
pub type LoadFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
handle: ModuleHandle,
) -> Result<i8, Error>,
>;
pub type UnloadFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
handle: ModuleHandle,
) -> Result<i8, Error>,
>;
pub type InitializeFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
handle: ModuleHandle,
) -> Result<i8, Error>,
>;
pub type TerminateFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
handle: ModuleHandle,
) -> Result<i8, Error>,
>;
pub type AddDependencyFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
handle: ModuleHandle,
interface: NonNullConst<InterfaceDescriptor>,
) -> Result<i8, Error>,
>;
pub type RemoveDependencyFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
handle: ModuleHandle,
interface: NonNullConst<InterfaceDescriptor>,
) -> Result<i8, Error>,
>;
pub type ExportInterfaceFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
handle: ModuleHandle,
interface: NonNullConst<InterfaceDescriptor>,
) -> Result<i8, Error>,
>;
pub type GetLoadDependenciesFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
handle: ModuleHandle,
) -> Result<ConstSpan<InterfaceDescriptor>, Error>,
>;
pub type GetRuntimeDependenciesFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
handle: ModuleHandle,
) -> Result<ConstSpan<InterfaceDescriptor>, Error>,
>;
pub type GetExportableInterfacesFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
handle: ModuleHandle,
) -> Result<ConstSpan<InterfaceDescriptor>, Error>,
>;
pub type FetchStatusFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
handle: ModuleHandle,
) -> Result<ModuleStatus, Error>,
>;
pub type GetModulePathFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
handle: ModuleHandle,
) -> Result<NonNullConst<OSPathChar>, Error>,
>;
pub type GetModuleInfoFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
handle: ModuleHandle,
) -> Result<NonNullConst<ModuleInfo>, Error>,
>;
pub type GetInterfaceFn = TypeWrapper<
unsafe extern "C-unwind" fn(
base_module: Option<NonNull<CBase>>,
handle: ModuleHandle,
interface: NonNullConst<InterfaceDescriptor>,
) -> Result<Interface, Error>,
>;
pub trait ModuleBinding {
unsafe fn register_loader(
&mut self,
loader: NonNullConst<ModuleLoaderInterface>,
mod_type: NonNullConst<ModuleType>,
) -> Result<LoaderHandle, Error>;
unsafe fn unregister_loader(&mut self, loader: LoaderHandle) -> Result<i8, Error>;
unsafe fn get_loader_interface(
&mut self,
loader: LoaderHandle,
) -> Result<NonNullConst<ModuleLoaderInterface>, Error>;
unsafe fn get_loader_handle_from_type(
&self,
mod_type: NonNullConst<ModuleType>,
) -> Result<LoaderHandle, Error>;
unsafe fn get_loader_handle_from_module(
&self,
handle: ModuleHandle,
) -> Result<LoaderHandle, Error>;
unsafe fn get_num_modules(&self) -> usize;
unsafe fn get_num_loaders(&self) -> usize;
unsafe fn get_num_exported_interfaces(&self) -> usize;
unsafe fn module_exists(&self, handle: ModuleHandle) -> Bool;
unsafe fn type_exists(&self, mod_type: NonNullConst<ModuleType>) -> Bool;
unsafe fn exported_interface_exists(
&self,
interface: NonNullConst<InterfaceDescriptor>,
) -> Bool;
unsafe fn get_modules(&self, buffer: NonNull<MutSpan<ModuleInfo>>) -> Result<usize, Error>;
unsafe fn get_module_types(&self, buffer: NonNull<MutSpan<ModuleType>>)
-> Result<usize, Error>;
unsafe fn get_exported_interfaces(
&self,
buffer: NonNull<MutSpan<InterfaceDescriptor>>,
) -> Result<usize, Error>;
unsafe fn get_exported_interface_handle(
&self,
interface: NonNullConst<InterfaceDescriptor>,
) -> Result<ModuleHandle, Error>;
unsafe fn create_module_handle(&mut self) -> ModuleHandle;
unsafe fn remove_module_handle(&mut self, handle: ModuleHandle) -> Result<i8, Error>;
unsafe fn link_module(
&mut self,
handle: ModuleHandle,
loader: LoaderHandle,
internal: InternalHandle,
) -> Result<i8, Error>;
unsafe fn get_internal_module_handle(
&self,
handle: ModuleHandle,
) -> Result<InternalHandle, Error>;
unsafe fn add_module(
&mut self,
loader: LoaderHandle,
path: NonNullConst<OSPathChar>,
) -> Result<ModuleHandle, Error>;
unsafe fn remove_module(&mut self, handle: ModuleHandle) -> Result<i8, Error>;
unsafe fn load(&mut self, handle: ModuleHandle) -> Result<i8, Error>;
unsafe fn unload(&mut self, handle: ModuleHandle) -> Result<i8, Error>;
unsafe fn initialize(&mut self, handle: ModuleHandle) -> Result<i8, Error>;
unsafe fn terminate(&mut self, handle: ModuleHandle) -> Result<i8, Error>;
unsafe fn add_dependency(
&mut self,
handle: ModuleHandle,
interface: NonNullConst<InterfaceDescriptor>,
) -> Result<i8, Error>;
unsafe fn remove_dependency(
&mut self,
handle: ModuleHandle,
interface: NonNullConst<InterfaceDescriptor>,
) -> Result<i8, Error>;
unsafe fn export_interface(
&mut self,
handle: ModuleHandle,
interface: NonNullConst<InterfaceDescriptor>,
) -> Result<i8, Error>;
unsafe fn get_load_dependencies(
&self,
handle: ModuleHandle,
) -> Result<ConstSpan<InterfaceDescriptor>, Error>;
unsafe fn get_runtime_dependencies(
&self,
handle: ModuleHandle,
) -> Result<ConstSpan<InterfaceDescriptor>, Error>;
unsafe fn get_exportable_interfaces(
&self,
handle: ModuleHandle,
) -> Result<ConstSpan<InterfaceDescriptor>, Error>;
unsafe fn fetch_status(&self, handle: ModuleHandle) -> Result<ModuleStatus, Error>;
unsafe fn get_module_path(
&self,
handle: ModuleHandle,
) -> Result<NonNullConst<OSPathChar>, Error>;
unsafe fn get_module_info(
&self,
handle: ModuleHandle,
) -> Result<NonNullConst<ModuleInfo>, Error>;
unsafe fn get_interface(
&self,
handle: ModuleHandle,
interface: NonNullConst<InterfaceDescriptor>,
) -> Result<Interface, Error>;
}
impl ModuleBinding for CBaseInterface {
#[inline]
unsafe fn register_loader(
&mut self,
loader: NonNullConst<ModuleLoaderInterface>,
mod_type: NonNullConst<ModuleType>,
) -> Result<LoaderHandle, Error> {
(self.module_register_loader_fn)(self.base_module, loader, mod_type)
}
#[inline]
unsafe fn unregister_loader(&mut self, loader: LoaderHandle) -> Result<i8, Error> {
(self.module_unregister_loader_fn)(self.base_module, loader)
}
#[inline]
unsafe fn get_loader_interface(
&mut self,
loader: LoaderHandle,
) -> Result<NonNullConst<ModuleLoaderInterface>, Error> {
(self.module_get_loader_interface_fn)(self.base_module, loader)
}
#[inline]
unsafe fn get_loader_handle_from_type(
&self,
mod_type: NonNullConst<ModuleType>,
) -> Result<LoaderHandle, Error> {
(self.module_get_loader_handle_from_type_fn)(self.base_module, mod_type)
}
#[inline]
unsafe fn get_loader_handle_from_module(
&self,
handle: ModuleHandle,
) -> Result<LoaderHandle, Error> {
(self.module_get_loader_handle_from_module_fn)(self.base_module, handle)
}
#[inline]
unsafe fn get_num_modules(&self) -> usize {
(self.module_get_num_modules_fn)(self.base_module)
}
#[inline]
unsafe fn get_num_loaders(&self) -> usize {
(self.module_get_num_loaders_fn)(self.base_module)
}
#[inline]
unsafe fn get_num_exported_interfaces(&self) -> usize {
(self.module_get_num_exported_interfaces_fn)(self.base_module)
}
#[inline]
unsafe fn module_exists(&self, handle: ModuleHandle) -> Bool {
(self.module_module_exists_fn)(self.base_module, handle)
}
#[inline]
unsafe fn type_exists(&self, mod_type: NonNullConst<ModuleType>) -> Bool {
(self.module_type_exists_fn)(self.base_module, mod_type)
}
#[inline]
unsafe fn exported_interface_exists(
&self,
interface: NonNullConst<InterfaceDescriptor>,
) -> Bool {
(self.module_exported_interface_exists_fn)(self.base_module, interface)
}
#[inline]
unsafe fn get_modules(&self, buffer: NonNull<MutSpan<ModuleInfo>>) -> Result<usize, Error> {
(self.module_get_modules_fn)(self.base_module, buffer)
}
#[inline]
unsafe fn get_module_types(
&self,
buffer: NonNull<MutSpan<ModuleType>>,
) -> Result<usize, Error> {
(self.module_get_module_types_fn)(self.base_module, buffer)
}
#[inline]
unsafe fn get_exported_interfaces(
&self,
buffer: NonNull<MutSpan<InterfaceDescriptor>>,
) -> Result<usize, Error> {
(self.module_get_exported_interfaces_fn)(self.base_module, buffer)
}
#[inline]
unsafe fn get_exported_interface_handle(
&self,
interface: NonNullConst<InterfaceDescriptor>,
) -> Result<ModuleHandle, Error> {
(self.module_get_exported_interface_handle_fn)(self.base_module, interface)
}
#[inline]
unsafe fn create_module_handle(&mut self) -> ModuleHandle {
(self.module_create_module_handle_fn)(self.base_module)
}
#[inline]
unsafe fn remove_module_handle(&mut self, handle: ModuleHandle) -> Result<i8, Error> {
(self.module_remove_module_handle_fn)(self.base_module, handle)
}
#[inline]
unsafe fn link_module(
&mut self,
handle: ModuleHandle,
loader: LoaderHandle,
internal: InternalHandle,
) -> Result<i8, Error> {
(self.module_link_module_fn)(self.base_module, handle, loader, internal)
}
#[inline]
unsafe fn get_internal_module_handle(
&self,
handle: ModuleHandle,
) -> Result<InternalHandle, Error> {
(self.module_get_internal_module_handle_fn)(self.base_module, handle)
}
#[inline]
unsafe fn add_module(
&mut self,
loader: LoaderHandle,
path: NonNullConst<OSPathChar>,
) -> Result<ModuleHandle, Error> {
(self.module_add_module_fn)(self.base_module, loader, path)
}
#[inline]
unsafe fn remove_module(&mut self, handle: ModuleHandle) -> Result<i8, Error> {
(self.module_remove_module_fn)(self.base_module, handle)
}
#[inline]
unsafe fn load(&mut self, handle: ModuleHandle) -> Result<i8, Error> {
(self.module_load_fn)(self.base_module, handle)
}
#[inline]
unsafe fn unload(&mut self, handle: ModuleHandle) -> Result<i8, Error> {
(self.module_unload_fn)(self.base_module, handle)
}
#[inline]
unsafe fn initialize(&mut self, handle: ModuleHandle) -> Result<i8, Error> {
(self.module_initialize_fn)(self.base_module, handle)
}
#[inline]
unsafe fn terminate(&mut self, handle: ModuleHandle) -> Result<i8, Error> {
(self.module_terminate_fn)(self.base_module, handle)
}
#[inline]
unsafe fn add_dependency(
&mut self,
handle: ModuleHandle,
interface: NonNullConst<InterfaceDescriptor>,
) -> Result<i8, Error> {
(self.module_add_dependency_fn)(self.base_module, handle, interface)
}
#[inline]
unsafe fn remove_dependency(
&mut self,
handle: ModuleHandle,
interface: NonNullConst<InterfaceDescriptor>,
) -> Result<i8, Error> {
(self.module_remove_dependency_fn)(self.base_module, handle, interface)
}
#[inline]
unsafe fn export_interface(
&mut self,
handle: ModuleHandle,
interface: NonNullConst<InterfaceDescriptor>,
) -> Result<i8, Error> {
(self.module_export_interface_fn)(self.base_module, handle, interface)
}
#[inline]
unsafe fn get_load_dependencies(
&self,
handle: ModuleHandle,
) -> Result<ConstSpan<InterfaceDescriptor>, Error> {
(self.module_get_load_dependencies_fn)(self.base_module, handle)
}
#[inline]
unsafe fn get_runtime_dependencies(
&self,
handle: ModuleHandle,
) -> Result<ConstSpan<InterfaceDescriptor>, Error> {
(self.module_get_runtime_dependencies_fn)(self.base_module, handle)
}
#[inline]
unsafe fn get_exportable_interfaces(
&self,
handle: ModuleHandle,
) -> Result<ConstSpan<InterfaceDescriptor>, Error> {
(self.module_get_exportable_interfaces_fn)(self.base_module, handle)
}
#[inline]
unsafe fn fetch_status(&self, handle: ModuleHandle) -> Result<ModuleStatus, Error> {
(self.module_fetch_status_fn)(self.base_module, handle)
}
#[inline]
unsafe fn get_module_path(
&self,
handle: ModuleHandle,
) -> Result<NonNullConst<OSPathChar>, Error> {
(self.module_get_module_path_fn)(self.base_module, handle)
}
#[inline]
unsafe fn get_module_info(
&self,
handle: ModuleHandle,
) -> Result<NonNullConst<ModuleInfo>, Error> {
(self.module_get_module_info_fn)(self.base_module, handle)
}
#[inline]
unsafe fn get_interface(
&self,
handle: ModuleHandle,
interface: NonNullConst<InterfaceDescriptor>,
) -> Result<Interface, Error> {
(self.module_get_interface_fn)(self.base_module, handle, interface)
}
}