use crate::ffi::library::OSPathChar;
use crate::global::{get_interface as get_interface_glob, get_mut_interface};
use crate::module::module_loader::{ModuleLoader, ModuleLoaderABICompat, ModuleLoaderAPI};
use crate::module::{
Error, Interface, InterfaceDescriptor, InternalModule, Loader, Module, ModuleAPI, ModuleInfo,
ModuleStatus, ModuleType,
};
use crate::ownership::{
BorrowImmutable, BorrowMutable, ImmutableAccessIdentifier, MutableAccessIdentifier, Owned,
};
use std::path::Path;
#[inline]
pub fn register_loader<'loader, LT, L>(
loader: &'loader LT,
mod_type: &impl AsRef<str>,
) -> Result<Loader<'static, Owned>, Error>
where
L: ModuleLoaderAPI<'static>,
ModuleLoader<L, Owned>: From<&'loader LT>,
{
ModuleAPI::register_loader(get_mut_interface(), loader, mod_type)
}
#[inline]
pub fn unregister_loader(loader: Loader<'_, Owned>) -> Result<(), Error> {
ModuleAPI::unregister_loader(get_mut_interface(), loader)
}
#[inline]
pub fn get_loader_interface<'loader, O, L>(
loader: &Loader<'loader, O>,
) -> Result<ModuleLoader<L, O>, Error>
where
O: ImmutableAccessIdentifier,
L: ModuleLoaderAPI<'loader> + ModuleLoaderABICompat,
{
ModuleAPI::get_loader_interface(get_mut_interface(), loader)
}
#[inline]
pub fn get_loader_handle_from_type(
mod_type: &impl AsRef<str>,
) -> Result<Loader<'static, BorrowMutable<'_>>, Error> {
ModuleAPI::get_loader_handle_from_type(get_interface_glob(), mod_type)
}
#[inline]
pub fn get_loader_handle_from_module<'m, 'module, O>(
module: &'m Module<'module, O>,
) -> Result<Loader<'module, BorrowMutable<'m>>, Error>
where
O: ImmutableAccessIdentifier,
{
ModuleAPI::get_loader_handle_from_module(get_interface_glob(), module)
}
#[inline]
pub fn get_num_modules() -> usize {
ModuleAPI::get_num_modules(get_interface_glob())
}
#[inline]
pub fn get_num_loaders() -> usize {
ModuleAPI::get_num_loaders(get_interface_glob())
}
#[inline]
pub fn get_num_exported_interfaces() -> usize {
ModuleAPI::get_num_exported_interfaces(get_interface_glob())
}
#[inline]
pub fn module_exists<O>(module: &Module<'_, O>) -> bool
where
O: ImmutableAccessIdentifier,
{
ModuleAPI::module_exists(get_interface_glob(), module)
}
#[inline]
pub fn type_exists(mod_type: &impl AsRef<str>) -> Result<bool, Error> {
ModuleAPI::type_exists(get_interface_glob(), mod_type)
}
#[inline]
pub fn exported_interface_exists(interface: &InterfaceDescriptor) -> bool {
ModuleAPI::exported_interface_exists(get_interface_glob(), interface)
}
#[inline]
pub fn get_modules(buffer: &mut impl AsMut<[ModuleInfo]>) -> Result<usize, Error> {
ModuleAPI::get_modules(get_interface_glob(), buffer)
}
#[inline]
pub fn get_module_types(buffer: &mut impl AsMut<[ModuleType]>) -> Result<usize, Error> {
ModuleAPI::get_module_types(get_interface_glob(), buffer)
}
#[inline]
pub fn get_exported_interfaces(
buffer: &mut impl AsMut<[InterfaceDescriptor]>,
) -> Result<usize, Error> {
ModuleAPI::get_exported_interfaces(get_interface_glob(), buffer)
}
#[inline]
pub fn get_exported_interface_handle(
interface: &InterfaceDescriptor,
) -> Result<Module<'static, BorrowImmutable<'_>>, Error> {
ModuleAPI::get_exported_interface_handle(get_interface_glob(), interface)
}
#[inline]
pub unsafe fn create_module_handle() -> Module<'static, Owned> {
ModuleAPI::create_module_handle(get_mut_interface())
}
#[inline]
pub unsafe fn remove_module_handle(module: Module<'_, Owned>) -> Result<(), Error> {
ModuleAPI::remove_module_handle(get_mut_interface(), module)
}
#[inline]
pub unsafe fn link_module<'module, 'loader, O, LO, IO>(
module: &Module<'module, O>,
loader: &Loader<'loader, LO>,
internal: &InternalModule<IO>,
) -> Result<(), Error>
where
'loader: 'module,
O: MutableAccessIdentifier,
LO: ImmutableAccessIdentifier,
IO: ImmutableAccessIdentifier,
{
ModuleAPI::link_module(get_mut_interface(), module, loader, internal)
}
#[inline]
pub fn get_internal_module_handle<O>(module: &Module<'_, O>) -> Result<InternalModule<O>, Error>
where
O: ImmutableAccessIdentifier,
{
ModuleAPI::get_internal_module_handle(get_interface_glob(), module)
}
#[inline]
pub fn add_module<O>(
loader: &Loader<'static, O>,
path: &impl AsRef<Path>,
) -> Result<Module<'static, Owned>, Error>
where
O: MutableAccessIdentifier,
{
ModuleAPI::add_module(get_mut_interface(), loader, path)
}
#[inline]
pub fn remove_module(module: Module<'_, Owned>) -> Result<(), Error> {
ModuleAPI::remove_module(get_mut_interface(), module)
}
#[inline]
pub fn load<O>(module: &mut Module<'_, O>) -> Result<(), Error>
where
O: MutableAccessIdentifier,
{
ModuleAPI::load(get_mut_interface(), module)
}
#[inline]
pub fn unload<O>(module: &mut Module<'_, O>) -> Result<(), Error>
where
O: MutableAccessIdentifier,
{
ModuleAPI::unload(get_mut_interface(), module)
}
#[inline]
pub fn initialize<O>(module: &mut Module<'_, O>) -> Result<(), Error>
where
O: MutableAccessIdentifier,
{
ModuleAPI::initialize(get_mut_interface(), module)
}
#[inline]
pub fn terminate<O>(module: &mut Module<'_, O>) -> Result<(), Error>
where
O: MutableAccessIdentifier,
{
ModuleAPI::terminate(get_mut_interface(), module)
}
#[inline]
pub fn add_dependency<O>(
module: &mut Module<'_, O>,
interface: &InterfaceDescriptor,
) -> Result<(), Error>
where
O: MutableAccessIdentifier,
{
ModuleAPI::add_dependency(get_mut_interface(), module, interface)
}
#[inline]
pub fn remove_dependency<O>(
module: &mut Module<'_, O>,
interface: &InterfaceDescriptor,
) -> Result<(), Error>
where
O: MutableAccessIdentifier,
{
ModuleAPI::remove_dependency(get_mut_interface(), module, interface)
}
#[inline]
pub fn export_interface<O>(
module: &Module<'_, O>,
interface: &InterfaceDescriptor,
) -> Result<(), Error>
where
O: ImmutableAccessIdentifier,
{
ModuleAPI::export_interface(get_mut_interface(), module, interface)
}
#[inline]
pub fn get_load_dependencies<'module, O>(
module: &Module<'module, O>,
) -> Result<&'module [InterfaceDescriptor], Error>
where
O: ImmutableAccessIdentifier,
{
ModuleAPI::get_load_dependencies(get_interface_glob(), module)
}
#[inline]
pub fn get_runtime_dependencies<'module, O>(
module: &Module<'module, O>,
) -> Result<&'module [InterfaceDescriptor], Error>
where
O: ImmutableAccessIdentifier,
{
ModuleAPI::get_runtime_dependencies(get_interface_glob(), module)
}
#[inline]
pub fn get_exportable_interfaces<'module, O>(
module: &Module<'module, O>,
) -> Result<&'module [InterfaceDescriptor], Error>
where
O: ImmutableAccessIdentifier,
{
ModuleAPI::get_exportable_interfaces(get_interface_glob(), module)
}
#[inline]
pub fn fetch_status<O>(module: &Module<'_, O>) -> Result<ModuleStatus, Error>
where
O: ImmutableAccessIdentifier,
{
ModuleAPI::fetch_status(get_interface_glob(), module)
}
#[inline]
pub fn get_module_path<'module, O>(
module: &Module<'module, O>,
) -> Result<&'module [OSPathChar], Error>
where
O: ImmutableAccessIdentifier,
{
ModuleAPI::get_module_path(get_interface_glob(), module)
}
#[inline]
pub fn get_module_info<'module, O>(
module: &Module<'module, O>,
) -> Result<&'module ModuleInfo, Error>
where
O: ImmutableAccessIdentifier,
{
ModuleAPI::get_module_info(get_interface_glob(), module)
}
#[inline]
pub fn get_interface<'module, O, T>(
module: &'module Module<'_, O>,
interface: &InterfaceDescriptor,
caster: impl FnOnce(crate::ffi::module::Interface) -> T,
) -> Result<Interface<'module, T>, Error>
where
O: ImmutableAccessIdentifier,
{
ModuleAPI::get_interface(get_interface_glob(), module, interface, caster)
}