Skip to main content

rabia_persistence/
in_memory.rs

1use async_trait::async_trait;
2use parking_lot::RwLock;
3use rabia_core::{persistence::PersistenceLayer, Result};
4use std::sync::Arc;
5
6/// Simple in-memory persistence implementation.
7///
8/// This implementation stores a single state value in memory. It's suitable for
9/// testing and non-persistent scenarios where state doesn't need to survive
10/// process restarts.
11#[derive(Debug, Clone)]
12pub struct InMemoryPersistence {
13    state: Arc<RwLock<Option<Vec<u8>>>>,
14}
15
16impl InMemoryPersistence {
17    /// Create a new in-memory persistence instance.
18    pub fn new() -> Self {
19        Self {
20            state: Arc::new(RwLock::new(None)),
21        }
22    }
23}
24
25impl Default for InMemoryPersistence {
26    fn default() -> Self {
27        Self::new()
28    }
29}
30
31#[async_trait]
32impl PersistenceLayer for InMemoryPersistence {
33    async fn save_state(&self, state: &[u8]) -> Result<()> {
34        let mut current_state = self.state.write();
35        *current_state = Some(state.to_vec());
36        Ok(())
37    }
38
39    async fn load_state(&self) -> Result<Option<Vec<u8>>> {
40        let state = self.state.read();
41        Ok(state.clone())
42    }
43}