1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
extern crate prototty_monolithic_storage; extern crate serde; extern crate wasm_bindgen; use serde::de::DeserializeOwned; use serde::ser::Serialize; pub use prototty_monolithic_storage::{LoadError, Storage, StoreError}; use prototty_monolithic_storage::{MonoStorage, StoreBytes}; use wasm_bindgen::prelude::*; #[wasm_bindgen] extern "C" { pub type JsByteStorage; #[wasm_bindgen(method)] fn js_load(this: &JsByteStorage) -> Vec<u8>; #[wasm_bindgen(method)] fn js_store(this: &JsByteStorage, data: &[u8]); } impl StoreBytes for JsByteStorage { fn store(&mut self, bytes: &[u8]) { self.js_store(bytes); } } pub struct WasmStorage(MonoStorage<JsByteStorage>); impl WasmStorage { pub fn new(js_byte_storage: JsByteStorage) -> Self { let existing_data = js_byte_storage.js_load(); WasmStorage(MonoStorage::from_bytes_or_empty( &existing_data, js_byte_storage, )) } } impl Storage for WasmStorage { fn load_raw<K>(&self, key: K) -> Result<Vec<u8>, LoadError> where K: AsRef<str>, { self.0.load_raw(key) } fn store_raw<K, V>(&mut self, key: K, value: V) -> Result<(), StoreError> where K: AsRef<str>, V: AsRef<[u8]>, { self.0.store_raw(key, value) } fn remove_raw<K>(&mut self, key: K) -> Result<Vec<u8>, LoadError> where K: AsRef<str>, { self.0.remove_raw(key) } fn exists<K>(&self, key: K) -> bool where K: AsRef<str>, { self.0.exists(key) } fn clear(&mut self) { self.0.clear(); } fn load<K, T>(&self, key: K) -> Result<T, LoadError> where K: AsRef<str>, T: DeserializeOwned, { self.0.load(key) } fn store<K, T>(&mut self, key: K, value: &T) -> Result<(), StoreError> where K: AsRef<str>, T: Serialize, { self.0.store(key, value) } fn remove<K, T>(&mut self, key: K) -> Result<T, LoadError> where K: AsRef<str>, T: DeserializeOwned, { self.0.remove(key) } }