signer-core 0.1.0

Signer core package.
Documentation
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(())
  }
}