73 lines
2.1 KiB
Rust
Executable File
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::*;
|