use std::fs;
pub use std::path::PathBuf;
use crate::signer_user::SignerUser;
pub struct SignerFsStore {
root: PathBuf,
}
impl SignerFsStore {
pub fn new(p: String) -> Self {
Self { root: PathBuf::from(p) }
}
pub fn save_signer_user(&self, user: &SignerUser) -> anyhow::Result<()> {
let target_dir = self.root.join(&user.public.pub_key);
if !fs::exists(&target_dir)? {
fs::create_dir_all(&target_dir)?;
}
fs::write(
target_dir.join("user.json"),
serde_json::to_string_pretty(&user)?,
)?;
Ok(())
}
pub fn load_signer_user(&self, pub_key: &str) -> anyhow::Result<SignerUser> {
let user_bytes = fs::read(self.root.join(pub_key).join("user.json"))?;
let user: SignerUser = serde_json::from_slice(&user_bytes)?;
Ok(user)
}
pub fn list_signer_user(&self) -> anyhow::Result<Vec<SignerUser>> {
let mut collection = Vec::new();
if !fs::exists(&self.root)? {
return Ok(collection);
}
for entry in fs::read_dir(&self.root)? {
let entry = entry?;
if let Ok(val) =
self.load_signer_user(entry.file_name().to_str().unwrap())
{
collection.push(val);
}
}
Ok(collection)
}
pub fn drop_signer_user(&self, user: &SignerUser) -> anyhow::Result<()> {
fs::remove_dir_all(self.root.join(&user.public.pub_key))?;
Ok(())
}
}