use clap::Subcommand;
use clap::builder::BoolishValueParser;
use rusk_recovery_tools::Theme;
use std::io;
use tracing::info;
#[allow(clippy::large_enum_variant)]
#[derive(PartialEq, Eq, Hash, Clone, Subcommand, Debug)]
pub enum RecoveryCommand {
#[cfg(feature = "recovery-keys")]
Keys {
#[clap(short, long, value_parser = BoolishValueParser::new(), env = "RUSK_KEEP_KEYS")]
keep: bool,
#[clap(
long,
default_value = "https://testnet.nodes.dusk.network/trusted-setup",
env = "RUSK_CRS_URL"
)]
crs_url: String,
},
#[cfg(feature = "recovery-state")]
State {
#[clap(short = 'f', value_parser = BoolishValueParser::new(), long, env = "RUSK_FORCE_STATE")]
force: bool,
#[clap(short, long, value_parser, env = "RUSK_RECOVERY_INPUT")]
init: std::path::PathBuf,
#[clap(short, long, value_parser, num_args(1))]
output: Option<std::path::PathBuf>,
},
}
impl RecoveryCommand {
fn display_env(theme: &Theme) -> io::Result<()> {
let profile_dir = rusk_profile::get_rusk_profile_dir()?;
let circuits_dir = rusk_profile::get_rusk_circuits_dir()?;
let keys_dir = rusk_profile::get_rusk_keys_dir()?;
let state_dir = rusk_profile::get_rusk_state_dir()?;
info!("{} {}", theme.info("PROFILE"), profile_dir.display());
info!("{} {}", theme.info("CIRCUITS"), circuits_dir.display());
info!("{} {}", theme.info("KEYS"), keys_dir.display());
info!("{} {}", theme.info("STATE"), state_dir.display());
Ok(())
}
pub fn run(self) -> Result<(), Box<dyn std::error::Error>> {
let theme = Theme::default();
Self::display_env(&theme)?;
let result = match self {
#[cfg(feature = "recovery-state")]
Self::State {
force,
init,
output,
} => crate::args::state::recovery_state(init, force, output),
#[cfg(feature = "recovery-keys")]
Self::Keys { keep, crs_url } => {
rusk_recovery_tools::keys::exec(keep, crs_url)
}
};
if let Err(e) = &result {
tracing::error!("{} {e}", theme.error("Error"));
}
result
}
}