use std::{collections::HashMap, sync::Arc};
use tari_engine_types::substate::{Substate, SubstateId};
use crate::state_store::{StateReader, StateStoreError, StateWriter};
#[derive(Debug, Clone, Default)]
pub struct MemoryStateStore {
state: HashMap<SubstateId, Substate>,
}
impl MemoryStateStore {
pub fn new() -> Self {
Self::default()
}
pub fn set_many<T: IntoIterator<Item = (SubstateId, Substate)>>(&mut self, iter: T) -> Result<(), StateStoreError> {
self.state.extend(iter);
Ok(())
}
pub fn count(&self) -> usize {
self.state.len()
}
pub fn iter(&self) -> impl Iterator<Item = (&SubstateId, &Substate)> {
self.state.iter()
}
pub fn delete_state(&mut self, key: &SubstateId) {
self.state.remove(key);
}
pub fn into_read_only(self) -> ReadOnlyMemoryStateStore {
ReadOnlyMemoryStateStore {
state: Arc::new(self.state),
}
}
}
impl StateReader for MemoryStateStore {
fn get_state(&self, key: &SubstateId) -> Result<&Substate, StateStoreError> {
self.state.get(key).ok_or_else(|| StateStoreError::NotFound {
kind: "state",
key: key.to_string(),
})
}
fn exists(&self, key: &SubstateId) -> Result<bool, StateStoreError> {
Ok(self.state.contains_key(key))
}
}
impl StateWriter for MemoryStateStore {
fn set_state(&mut self, key: SubstateId, value: Substate) -> Result<(), StateStoreError> {
self.state.insert(key, value);
Ok(())
}
}
#[derive(Debug, Clone, Default)]
pub struct ReadOnlyMemoryStateStore {
state: Arc<HashMap<SubstateId, Substate>>,
}
impl ReadOnlyMemoryStateStore {
pub fn count(&self) -> usize {
self.state.len()
}
pub fn iter(&self) -> impl Iterator<Item = (&SubstateId, &Substate)> {
self.state.iter()
}
}
impl StateReader for ReadOnlyMemoryStateStore {
fn get_state(&self, key: &SubstateId) -> Result<&Substate, StateStoreError> {
self.state.get(key).ok_or_else(|| StateStoreError::NotFound {
kind: "state",
key: key.to_string(),
})
}
fn exists(&self, key: &SubstateId) -> Result<bool, StateStoreError> {
Ok(self.state.contains_key(key))
}
}