use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::io;
use crate::store::InnerStore;
#[derive(Default, Serialize, Deserialize)]
pub struct MemStore {
pub strings: InnerStore<String>,
}
impl MemStore {
pub fn new() -> Self {
Self::default()
}
pub fn insert_string(&mut self, key: &str, value: &str) -> io::Result<()> {
self.strings.insert(key, value.to_string())
}
pub fn get_string(&self, key: &str) -> io::Result<String> {
self.strings.retrieve(key)
}
pub fn remove_string(&mut self, key: &str) -> io::Result<String> {
self.strings.remove(key)
}
pub fn clear_strings(&mut self) -> io::Result<()> {
self.strings.clear()
}
pub fn get_string_store_ref(&self) -> &HashMap<String, String> {
self.strings.get_ref()
}
}
#[cfg(test)]
mod memstore {
use super::*;
#[test]
fn empty() {
let ms = MemStore::new();
let strings = ms.strings.get_ref();
assert_eq!(strings.len(), 0);
}
#[test]
fn string_store_add_entries() -> io::Result<()> {
let mut ms = MemStore::new();
ms.insert_string("key1", "value1")?;
assert_eq!(ms.strings.len(), 1);
ms.insert_string("key2", "value2")?;
assert_eq!(ms.strings.len(), 2);
Ok(())
}
#[test]
fn string_store_add_loads_of_entries() -> io::Result<()> {
let mut ms = MemStore::new();
for i in 0..100_000 {
let key = format!("key-{}", i);
let value = format!("value-{}", i);
ms.insert_string(&key, &value)?;
}
assert!(ms.strings.len() == 100_000);
Ok(())
}
#[test]
fn string_store_get_entries() -> io::Result<()> {
let mut ms = MemStore::new();
ms.insert_string("key1", "value1")?;
ms.insert_string("key2", "value2")?;
let mut result = ms.get_string("key2")?;
assert_eq!(result, "value2");
result = ms.get_string("key1")?;
assert_eq!(result, "value1");
Ok(())
}
#[test]
fn string_store_no_entries() -> io::Result<()> {
let ms = MemStore::new();
let result = ms.get_string("key1")?;
assert_eq!(result, "");
Ok(())
}
#[test]
fn clear_string_store() -> io::Result<()> {
let mut ms = MemStore::new();
for i in 0..1000 {
let key = format!("key-{}", i);
ms.insert_string(&key, "value")?;
}
assert!(ms.strings.len() == 1000);
ms.clear_strings()?;
assert!(ms.strings.len() == 0);
Ok(())
}
}