signer-core 0.3.2

Signer core package.
Documentation
use std::fs;
pub use std::path::PathBuf;

use crate::signer_user::SignerUser;
use crate::Result;

pub struct SignerFsStore {
    pub root: PathBuf,
}

impl SignerFsStore {
    pub fn new(p: String) -> Self {
        Self {
            root: PathBuf::from(p),
        }
    }

    pub fn save_signer_user(&self, user: &SignerUser) -> 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) -> 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) -> 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) -> Result<()> {
        fs::remove_dir_all(self.root.join(&user.public.pub_key))?;
        Ok(())
    }
}