use crate::helpers::args::parse_node_data_dir;
use snarkos_utilities::NodeDataDir;
use snarkvm::console::network::{CanaryV0, MainnetV0, Network};
use aleo_std::StorageMode;
use anyhow::{Context, Result};
use clap::Parser;
use colored::Colorize;
use std::path::PathBuf;
#[derive(Debug, Parser)]
pub struct Clean {
#[clap(default_value_t=MainnetV0::ID, long = "network", value_parser = clap::value_parser!(u16).range((MainnetV0::ID as i64)..=(CanaryV0::ID as i64)))]
pub network: u16,
#[clap(long)]
pub dev: Option<u16>,
#[clap(long, alias = "path")]
pub ledger_storage: Option<PathBuf>,
#[clap(long)]
pub keep_node_data: bool,
#[clap(long, alias = "node-data-path", conflicts_with = "keep_node_data")]
pub node_data_storage: Option<PathBuf>,
}
impl Clean {
pub fn parse(self) -> Result<String> {
if !self.keep_node_data {
let node_data_dir = parse_node_data_dir(&self.node_data_storage, self.network, self.dev)?;
println!("{}", Self::remove_node_data(&node_data_dir)?);
}
let storage_mode = match self.ledger_storage {
Some(path) => StorageMode::Custom(path),
None => match self.dev {
Some(id) => StorageMode::Development(id),
None => StorageMode::Production,
},
};
Self::remove_ledger(self.network, &storage_mode)
}
fn remove_node_data(node_data_dir: &NodeDataDir) -> Result<String> {
let data_path = node_data_dir.path();
let path_string = format!("(in \"{}\")", data_path.display()).dimmed();
if data_path.exists() {
std::fs::remove_dir_all(data_path).with_context(|| format!("Failed to remove node data {path_string}"))?;
Ok(format!("✅ Cleaned up node data {path_string}"))
} else {
Ok(format!("✅ No node data was found {path_string}"))
}
}
pub(crate) fn remove_ledger(network: u16, mode: &StorageMode) -> Result<String> {
let path = aleo_std::aleo_ledger_dir(network, mode);
let path_string = format!("(in \"{}\")", path.display()).dimmed();
if path.exists() {
std::fs::remove_dir_all(&path)
.with_context(|| format!("Failed to remove the snarkOS ledger {path_string}"))?;
Ok(format!("✅ Cleaned the snarkOS ledger {path_string}"))
} else {
Ok(format!("✅ No snarkOS ledger was found {path_string}"))
}
}
}