use anyhow::{Result, anyhow};
use clap::Parser;
use colored::Colorize;
use gring::{Keyring, SecretKey, cmd::Command};
use gsdk::ext::sp_core::{Pair, sr25519};
const DEFAULT_DEV: &str = "//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)]
Gring(Command),
}
impl Wallet {
pub fn run(&self) -> anyhow::Result<()> {
match self {
Wallet::Dev { name, uri } => Self::dev(name, uri.clone()),
Wallet::Gring(command) => command.clone().run(),
}
}
pub fn dev(name: &str, uri: Option<String>) -> Result<()> {
let mut keyring = Keyring::load(Command::store()?)?;
if keyring.set_primary(name.into()).is_ok() {
println!("Successfully switched to dev account {} !", name.cyan());
return Ok(());
}
let sk = SecretKey::from_bytes(
&sr25519::Pair::from_string(&uri.unwrap_or(DEFAULT_DEV.into()), None)?.to_raw_vec(),
)
.map_err(|_| anyhow!("Failed to create keypair from the input uri."))?;
keyring.add(name, sk.into(), None)?;
keyring.set_primary(name.into())?;
println!("Successfully switched to dev account {} !", name.cyan());
Ok(())
}
}