#![allow(clippy::std_instead_of_core)]
use core::ffi::c_void;
use polyplug::loader::BundleLoader;
use crate::{DotnetConfig, DotnetLoader, config::HostfxrLocation};
#[repr(C)]
pub struct PolyplugDotnetConfig {
pub min_framework_ptr: *const u8,
pub min_framework_len: usize,
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn polyplug_dotnet_loader_create(
config: *const PolyplugDotnetConfig,
) -> *mut c_void {
if config.is_null() {
return std::ptr::null_mut();
}
let cfg: &PolyplugDotnetConfig = unsafe { &*config };
if cfg.min_framework_ptr.is_null() {
return std::ptr::null_mut();
}
let bytes: &[u8] =
unsafe { std::slice::from_raw_parts(cfg.min_framework_ptr, cfg.min_framework_len) };
let min_framework: String = match std::str::from_utf8(bytes) {
Ok(s) => s.to_string(),
Err(_) => return std::ptr::null_mut(),
};
let loader: DotnetLoader = DotnetLoader::new(DotnetConfig {
min_framework,
hostfxr: HostfxrLocation::Auto,
});
let trait_obj: Box<dyn BundleLoader> = Box::new(loader);
Box::into_raw(Box::new(trait_obj)) as *mut c_void
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn polyplug_dotnet_loader_free(ptr: *mut c_void) {
if ptr.is_null() {
return;
}
drop(unsafe { Box::<Box<dyn BundleLoader>>::from_raw(ptr as *mut Box<dyn BundleLoader>) });
}