use async_trait::async_trait;
use crate::{
error::{Result, RialoError},
keyring::traits::{Keyring, KeyringProvider},
};
#[async_trait]
pub trait BaseKeyringProvider: KeyringProvider {
async fn check_keyring_exists(&self, name: &str) -> Result<()> {
if !self.exists(name).await? {
return Err(RialoError::Keyring(format!("Keyring not found: {name}")));
}
Ok(())
}
async fn get_keyring_public_key(&self, name: &str) -> Result<String> {
let pubkey = self.get_public_key(name).await?;
Ok(pubkey.to_string())
}
async fn validate_mnemonic_operation(
&self,
source_keyring_name: &str,
new_keyring_name: &str,
) -> Result<()> {
if !self.exists(source_keyring_name).await? {
return Err(RialoError::Keyring(format!(
"Source keyring '{source_keyring_name}' not found"
)));
}
if self.exists(new_keyring_name).await? {
return Err(RialoError::Keyring(format!(
"Keyring '{new_keyring_name}' already exists"
)));
}
Ok(())
}
async fn load_keyring_with_validation(
&self,
name: &str,
password: &str,
) -> Result<(Keyring, String)> {
let keyring = self.load(name, password).await?;
let mnemonic = keyring
.mnemonic()
.ok_or_else(|| {
RialoError::Keyring("Keyring does not have a mnemonic phrase".to_string())
})?
.to_string();
Ok((keyring, mnemonic))
}
}
#[deprecated(since = "0.2.0", note = "Use BaseKeyringProvider instead")]
pub trait BaseWalletProvider: BaseKeyringProvider {}
#[allow(deprecated)]
impl<T: BaseKeyringProvider> BaseWalletProvider for T {}