Gen7ScriptsRs/pkmn_lib_interface/src/app_interface/dynamic_data/dynamic_library.rs

73 lines
2.1 KiB
Rust
Executable File

use crate::app_interface::StaticData;
use alloc::rc::Rc;
pub trait DynamicLibraryTrait {
fn data_library(&self) -> StaticData;
}
pub type DynamicLibrary = Rc<dyn DynamicLibraryTrait>;
#[cfg(not(feature = "mock_data"))]
mod implementation {
use super::*;
use crate::app_interface::dynamic_data::dynamic_library::DynamicLibraryTrait;
use crate::app_interface::StaticDataImpl;
use crate::cached_value;
use crate::handling::cached_value::CachedValue;
use crate::handling::extern_ref::{ExternRef, ExternalReferenceType};
use crate::handling::wasm_result::WasmResult;
use crate::handling::Cacheable;
use alloc::rc::Rc;
struct DynamicLibraryInner {
ptr: ExternRef<DynamicLibraryImpl>,
static_data: CachedValue<StaticData>,
}
#[derive(Clone)]
pub struct DynamicLibraryImpl {
inner: Rc<DynamicLibraryInner>,
}
crate::handling::cacheable::cacheable!(DynamicLibraryImpl);
impl DynamicLibraryImpl {
pub(crate) fn new(ptr: ExternRef<Self>) -> Self {
Self::from_ref(ptr, &|ptr| Self {
inner: Rc::new(DynamicLibraryInner {
ptr,
static_data: cached_value!({
Rc::new(
dynamic_library_get_static_data(ptr)
.unwrap()
.get_value()
.unwrap(),
)
}),
}),
})
}
}
impl DynamicLibraryTrait for DynamicLibraryImpl {
fn data_library(&self) -> StaticData {
self.inner.static_data.value()
}
}
impl ExternalReferenceType for DynamicLibraryImpl {
fn from_extern_value(reference: ExternRef<Self>) -> Self {
DynamicLibraryImpl::new(reference)
}
}
extern "wasm" {
fn dynamic_library_get_static_data(
ptr: ExternRef<DynamicLibraryImpl>,
) -> WasmResult<ExternRef<StaticDataImpl>>;
}
}
#[cfg(not(feature = "mock_data"))]
pub use implementation::*;