PkmnLib_rs/src/ffi/dynamic_data/libraries/script_resolver.rs

60 lines
2.3 KiB
Rust

use crate::dynamic_data::{EmptyScriptResolver, ScriptResolver};
use crate::ffi::ffi_handle::FFIHandle;
use std::sync::Arc;
/// Instantiates a basic empty script resolver, that always returns None.
#[no_mangle]
extern "C" fn empty_script_resolver_new() -> FFIHandle<Arc<dyn ScriptResolver>> {
let v: Arc<dyn ScriptResolver> = Arc::new(EmptyScriptResolver {});
FFIHandle::get_handle(v.into())
}
/// Foreign function interfaces for the Webassembly script resolver.
#[cfg(feature = "wasm")]
mod web_assembly_script_resolver {
use crate::dynamic_data::ScriptResolver;
use crate::ffi::ffi_handle::{FFIHandle, FromFFIHandle};
use crate::ffi::FFIResult;
use crate::script_implementations::wasm::script_resolver::WebAssemblyScriptResolver;
use std::sync::Arc;
/// Instantiates a new WebAssemblyScriptResolver.
#[no_mangle]
extern "C" fn webassembly_script_resolver_new() -> FFIHandle<Arc<dyn ScriptResolver>> {
let v: Arc<dyn ScriptResolver> = WebAssemblyScriptResolver::new();
FFIHandle::get_handle(v.into())
}
/// Load a compiled WASM module.
#[no_mangle]
extern "C" fn webassembly_script_resolver_load_wasm_from_bytes(
ptr: FFIHandle<Arc<dyn ScriptResolver>>,
arr: *const u8,
len: usize,
) -> FFIResult<()> {
#[allow(clippy::unwrap_used)] // Unwrap used, but we know it cannot fail.
unsafe {
let script_resolver = ptr.from_ffi_handle();
let wasm_script_resolver = script_resolver
.as_any()
.downcast_ref::<WebAssemblyScriptResolver>()
.unwrap();
wasm_script_resolver
.load_wasm_from_bytes(std::slice::from_raw_parts(arr, len))
.into()
}
}
/// Tells the script resolver we're done loading wasm modules, and to finalize the resolver.
#[no_mangle]
#[allow(clippy::unwrap_used)] // Unwrap used, but we know it cannot fail.
extern "C" fn webassembly_script_resolver_finalize(ptr: FFIHandle<Arc<dyn ScriptResolver>>) -> FFIResult<()> {
let script_resolver = ptr.from_ffi_handle();
let wasm_script_resolver = script_resolver
.as_any()
.downcast_ref::<WebAssemblyScriptResolver>()
.unwrap();
wasm_script_resolver.finalize().into()
}
}