mod db;
mod error;
mod fs;
pub use self::db::DbStorage;
pub use self::error::KeystoreError;
pub use self::fs::FsStorage;
use core::Address;
use keystore::{CryptoType, KeyFile};
use util;
#[derive(Debug, Clone, Default)]
pub struct AccountInfo {
pub filename: String,
pub address: String,
pub name: String,
pub description: String,
pub is_hardware: bool,
pub is_hidden: bool,
}
impl From<KeyFile> for AccountInfo {
fn from(kf: KeyFile) -> Self {
let mut info = Self::default();
info.address = kf.address.to_string();
if let Some(name) = kf.name {
info.name = name;
};
if let Some(desc) = kf.description {
info.description = desc;
};
if let Some(visible) = kf.visible {
info.is_hidden = !visible;
};
info.is_hardware = match kf.crypto {
CryptoType::Core(_) => false,
CryptoType::HdWallet(_) => true,
};
info
}
}
pub trait KeyfileStorage: Send + Sync {
fn put(&self, kf: &KeyFile) -> Result<(), KeystoreError>;
fn delete(&self, addr: &Address) -> Result<(), KeystoreError>;
fn hide(&self, addr: &Address) -> Result<bool, KeystoreError>;
fn unhide(&self, addr: &Address) -> Result<bool, KeystoreError>;
fn update(
&self,
addr: &Address,
name: Option<String>,
desc: Option<String>,
) -> Result<(), KeystoreError>;
fn list_accounts(&self, show_hidden: bool) -> Result<Vec<AccountInfo>, KeystoreError>;
fn search_by_address(&self, addr: &Address) -> Result<(AccountInfo, KeyFile), KeystoreError>;
fn is_addr_exist(&self, addr: &Address) -> Result<(), KeystoreError> {
match self.search_by_address(addr) {
Ok((_, _)) => Ok(()),
Err(e) => match e {
KeystoreError::NotFound(_) => Err(KeystoreError::StorageError(format!(
"Address {} not in a storage",
addr
))),
_ => Err(e),
},
}
}
}
pub fn generate_filename(uuid: &str) -> String {
format!("UTC--{}Z--{}", &util::timestamp(), &uuid)
}