use std::{collections::HashMap, io, sync::{Arc, RwLock}, vec};
use uuid::Uuid;
use super::{Result, Storage, StorageError};
#[derive(Debug, Clone, Default)]
pub struct Memory {
entries: Arc<RwLock<HashMap<Uuid, Bytes>>>
}
impl Memory {
pub fn new() -> Self {
Self::default()
}
}
impl Storage for Memory {
type Read = BytesReader;
type Write = BytesWriter;
type Iterator = Iter;
fn new(&mut self) -> Result<(Uuid, Self::Write)> {
let mut entries = self.entries.write().unwrap();
loop {
let entry = Uuid::new_v4();
match entries.get(&entry) {
None => {
return Ok((entry, BytesWriter::write(entries.entry(entry).or_default())));
}
Some(_) => {
continue;
}
}
}
}
fn read(&self, entry: Uuid) -> Result<Self::Read> {
let entries = self.entries.read().unwrap();
match entries.get(&entry) {
Some(bytes) => {
let bytes = bytes.read().unwrap();
match *bytes {
Some(ref bytes) => Ok(BytesReader::read(bytes)),
None => Err(StorageError::not_found())
}
}
None => Err(StorageError::not_found())
}
}
fn write(&mut self, entry: Uuid) -> Result<Self::Write> {
let mut entries = self.entries.write().unwrap();
Ok(BytesWriter::write(entries.entry(entry).or_default()))
}
fn overwrite(&mut self, entry: Uuid) -> Result<Self::Write> {
let entries = self.entries.read().unwrap();
match entries.get(&entry) {
Some(bytes) => Ok(BytesWriter::write(bytes)),
None => Err(StorageError::not_found())
}
}
fn delete(&mut self, entry: Uuid) -> Result<bool> {
let mut entries = self.entries.write().unwrap();
Ok(entries.remove(&entry).is_some())
}
fn clear(&mut self) -> Result<()> {
let mut entries = self.entries.write().unwrap();
Ok(entries.clear())
}
fn iter(&self) -> Result<Self::Iterator> {
let entries = self.entries.read().unwrap();
Ok(entries
.keys()
.map(|entry| Ok(entry.clone()))
.collect::<Vec<Result<Uuid>>>()
.into_iter()
)
}
}
type Bytes = Arc<RwLock<Option<Vec<u8>>>>;
#[derive(Debug)]
pub struct BytesReader {
bytes: Vec<u8>,
index: usize,
}
impl BytesReader {
fn read(bytes: &Vec<u8>) -> Self {
Self {
bytes: bytes.clone(),
index: 0,
}
}
}
impl io::Read for BytesReader {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
use std::cmp::min;
let len = min(self.bytes.len() - self.index, buf.len());
let src = &self.bytes[self.index..self.index + len];
let dest = &mut buf[..len];
dest.copy_from_slice(&src);
self.index += len;
Ok(len)
}
}
#[derive(Debug)]
pub struct BytesWriter {
bytes: Bytes,
new_bytes: Vec<u8>,
}
impl BytesWriter {
fn write(entry: &Bytes) -> Self {
Self {
bytes: entry.clone(),
new_bytes: Vec::new(),
}
}
}
impl io::Write for BytesWriter {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.new_bytes.write(buf)
}
fn flush(&mut self) -> io::Result<()> {
self.new_bytes.flush()
}
}
impl Drop for BytesWriter {
fn drop(&mut self) {
let mut entry = self.bytes.write().unwrap();
*entry = Some(self.new_bytes.clone());
}
}
pub type Iter = vec::IntoIter<Result<Uuid>>;