leptos_sync_core/storage/
memory.rs1use super::{LocalStorage, StorageError};
4use async_trait::async_trait;
5use serde::{de::DeserializeOwned, Serialize};
6use std::collections::HashMap;
7use std::sync::Arc;
8use tokio::sync::RwLock;
9
10pub struct MemoryStorage {
12 data: Arc<RwLock<HashMap<String, Vec<u8>>>>,
13}
14
15impl MemoryStorage {
16 pub fn new() -> Self {
17 Self {
18 data: Arc::new(RwLock::new(HashMap::new())),
19 }
20 }
21}
22
23impl Default for MemoryStorage {
24 fn default() -> Self {
25 Self::new()
26 }
27}
28
29impl Clone for MemoryStorage {
30 fn clone(&self) -> Self {
31 Self {
32 data: self.data.clone(),
33 }
34 }
35}
36
37#[async_trait]
38impl LocalStorage for MemoryStorage {
39 async fn set<T: Serialize + Send + Sync>(&self, key: &str, value: &T) -> Result<(), StorageError> {
40 let serialized = serde_json::to_vec(value)
41 .map_err(|e| StorageError::Serialization(e))?;
42
43 let mut data = self.data.write().await;
44 data.insert(key.to_string(), serialized);
45 Ok(())
46 }
47
48 async fn get<T: DeserializeOwned + Send + Sync>(&self, key: &str) -> Result<Option<T>, StorageError> {
49 let data = self.data.read().await;
50
51 match data.get(key) {
52 Some(bytes) => {
53 let value = serde_json::from_slice(bytes)
54 .map_err(|e| StorageError::Serialization(e))?;
55 Ok(Some(value))
56 }
57 None => Ok(None),
58 }
59 }
60
61 async fn remove(&self, key: &str) -> Result<(), StorageError> {
62 let mut data = self.data.write().await;
63 data.remove(key);
64 Ok(())
65 }
66
67 async fn keys(&self) -> Result<Vec<String>, StorageError> {
68 let data = self.data.read().await;
69 Ok(data.keys().cloned().collect())
70 }
71
72 async fn contains_key(&self, key: &str) -> Result<bool, StorageError> {
73 let data = self.data.read().await;
74 Ok(data.contains_key(key))
75 }
76
77 async fn len(&self) -> Result<usize, StorageError> {
78 let data = self.data.read().await;
79 Ok(data.len())
80 }
81
82 async fn is_empty(&self) -> Result<bool, StorageError> {
83 let data = self.data.read().await;
84 Ok(data.is_empty())
85 }
86
87 async fn clear(&self) -> Result<(), StorageError> {
88 let mut data = self.data.write().await;
89 data.clear();
90 Ok(())
91 }
92}
93
94#[cfg(test)]
95mod tests {
96 use super::*;
97
98 #[tokio::test]
99 async fn test_memory_storage_basic_operations() {
100 let storage = MemoryStorage::new();
101
102 assert!(storage.set("key1", &"value1".to_string()).await.is_ok());
104 let value = storage.get::<String>("key1").await.unwrap();
105 assert_eq!(value, Some("value1".to_string()));
106
107 let value = storage.get::<String>("nonexistent").await.unwrap();
109 assert_eq!(value, None);
110
111 assert!(storage.remove("key1").await.is_ok());
113 let value = storage.get::<String>("key1").await.unwrap();
114 assert_eq!(value, None);
115 }
116
117 #[tokio::test]
118 async fn test_memory_storage_keys_and_length() {
119 let storage = MemoryStorage::new();
120
121 assert_eq!(storage.len().await.unwrap(), 0);
123 assert!(storage.is_empty().await.unwrap());
124
125 assert!(storage.set("key1", &"value1".to_string()).await.is_ok());
127 assert!(storage.set("key2", &"value2".to_string()).await.is_ok());
128
129 assert_eq!(storage.len().await.unwrap(), 2);
131 assert!(!storage.is_empty().await.unwrap());
132
133 let keys = storage.keys().await.unwrap();
134 assert_eq!(keys.len(), 2);
135 assert!(keys.contains(&"key1".to_string()));
136 assert!(keys.contains(&"key2".to_string()));
137 }
138
139 #[tokio::test]
140 async fn test_memory_storage_clear() {
141 let storage = MemoryStorage::new();
142
143 assert!(storage.set("key1", &"value1".to_string()).await.is_ok());
145 assert!(storage.set("key2", &"value2".to_string()).await.is_ok());
146
147 assert!(storage.clear().await.is_ok());
149
150 assert_eq!(storage.len().await.unwrap(), 0);
152 assert!(storage.is_empty().await.unwrap());
153 }
154
155 #[tokio::test]
156 async fn test_memory_storage_contains_key() {
157 let storage = MemoryStorage::new();
158
159 assert!(!storage.contains_key("key1").await.unwrap());
161
162 assert!(storage.set("key1", &"value1".to_string()).await.is_ok());
164 assert!(storage.contains_key("key1").await.unwrap());
165
166 assert!(storage.remove("key1").await.is_ok());
168 assert!(!storage.contains_key("key1").await.unwrap());
169 }
170
171 #[tokio::test]
172 async fn test_memory_storage_clone() {
173 let storage = MemoryStorage::new();
174 let cloned_storage = storage.clone();
175
176 assert!(storage.set("key1", &"value1".to_string()).await.is_ok());
178
179 let value = cloned_storage.get::<String>("key1").await.unwrap();
181 assert_eq!(value, Some("value1".to_string()));
182 }
183}