use crate::app::App;
use anyhow::Result;
use clap::Parser;
use colored::Colorize;
use gsdk::AccountKeyring;
use gsigner::{
cli::{GSignerCommands, display_result, execute_command},
keyring::KeystoreEntry,
sr25519::PrivateKey,
};
const DEFAULT_DEV: AccountKeyring = AccountKeyring::Alice;
#[derive(Clone, Debug, Parser)]
pub enum Wallet {
Dev {
#[clap(short, long, default_value = "_dev_alice")]
name: String,
#[clap(short, long)]
uri: Option<String>,
},
#[clap(flatten)]
Signer(GSignerCommands),
}
impl Wallet {
pub fn exec(self, app: &mut App) -> Result<()> {
match self {
Wallet::Dev { name, uri } => Self::dev(&name, uri.clone(), app),
Wallet::Signer(command) => {
let result = execute_command(command.clone())?;
display_result(&result);
Ok(())
}
}
}
pub fn dev(name: &str, uri: Option<String>, app: &mut App) -> Result<()> {
let mut keyring = app.keyring()?;
if !keyring
.list()
.iter()
.any(|keystore| keystore.name() == name)
{
let private_key = uri
.as_deref()
.and_then(|suri| PrivateKey::from_suri(suri, None).ok())
.unwrap_or_else(|| PrivateKey::from_keypair(DEFAULT_DEV.pair().into()));
keyring.add(name, private_key, None)?;
}
keyring.set_primary(name)?;
println!("Successfully switched to dev account {} !", name.cyan());
Ok(())
}
}