use alloc::boxed::Box;
use alloc::vec::Vec;
use anyhow::Result;
use crate::ZeroizingString;
pub trait PshStore {
fn exists(&self) -> bool;
fn records(&self) -> Box<dyn Iterator<Item=ZeroizingString>>;
fn append(&mut self, record: &ZeroizingString) -> Result<()>;
fn delete(&mut self, record: &ZeroizingString) -> Result<()>;
}
pub struct PshMemDb {
aliases: Vec<ZeroizingString>,
}
impl PshMemDb {
pub fn new() -> Self {
Self { aliases: Vec::new() }
}
}
impl PshStore for PshMemDb {
fn exists(&self) -> bool {
!self.aliases.is_empty()
}
fn records(&self) -> Box<dyn Iterator<Item=ZeroizingString>> {
let aliases = self.aliases.clone();
Box::new(aliases.into_iter())
}
fn append(&mut self, record: &ZeroizingString) -> Result<()> {
self.aliases.push(record.clone());
Ok(())
}
fn delete(&mut self, record: &ZeroizingString) -> Result<()> {
if let Some(index) = self.aliases.iter().position(|r| r == record) {
self.aliases.remove(index);
}
Ok(())
}
}