From ec40f6e3acc7874b82709ab81b254c741529fdff Mon Sep 17 00:00:00 2001 From: Mica White Date: Mon, 26 Oct 2026 10:52:04 -0400 Subject: Finish engine --- src/storage.rs | 84 ---------------------------------------------------------- 1 file changed, 84 deletions(-) delete mode 100644 src/storage.rs (limited to 'src/storage.rs') diff --git a/src/storage.rs b/src/storage.rs deleted file mode 100644 index 48fdcb4..0000000 --- a/src/storage.rs +++ /dev/null @@ -1,84 +0,0 @@ -use core::{ - alloc::Layout, - ops::{Deref, DerefMut}, -}; - -use alloc::alloc::{alloc, dealloc}; -use serde::{Deserialize, Serialize}; - -use crate::ScriptContext; - -mod tortuise { - #[link(wasm_import_module = "tortuise")] - unsafe extern "C" { - pub safe fn storage_size(context: u64) -> usize; - pub unsafe fn load_storage(context: u64, ptr: *mut u8); - pub unsafe fn save_storage(context: u64, ptr: *const u8, size: usize); - } -} - -fn load_storage<'de, T: Deserialize<'de>>(context: u64) -> Option { - unsafe { - let size = tortuise::storage_size(context); - let layout = Layout::array::(size).unwrap(); - let ptr = alloc(layout); - tortuise::load_storage(context, ptr); - let data = core::slice::from_raw_parts(ptr, size); - let data = messagepack_serde::from_slice(data).ok()?; - dealloc(ptr, layout); - Some(data) - } -} - -fn save_storage(context: u64, state: &T) { - unsafe { - let data = messagepack_serde::to_vec(state).unwrap(); - tortuise::save_storage(context, data.as_ptr(), data.len()); - } -} - -pub struct Storage { - initial_state: fn() -> T, -} - -pub struct StorageMut { - context: u64, - data: T, -} - -impl<'de, T: Serialize + Deserialize<'de>> Storage { - pub const fn new(initial_state: fn() -> T) -> Self { - Self { initial_state } - } - - pub fn load(&self, context: &ScriptContext) -> T { - load_storage(context.0).unwrap_or_else(self.initial_state) - } - - pub fn load_mut(&self, context: &ScriptContext) -> StorageMut { - StorageMut { - context: context.0, - data: load_storage(context.0).unwrap_or_else(self.initial_state), - } - } -} - -impl Deref for StorageMut { - type Target = T; - - fn deref(&self) -> &Self::Target { - &self.data - } -} - -impl DerefMut for StorageMut { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.data - } -} - -impl Drop for StorageMut { - fn drop(&mut self) { - save_storage(self.context, &self.data); - } -} -- cgit v1.3.1