use crate::error;
use clap::Args;
use sc_service::{BlocksPruning, PruningMode};
#[derive(Debug, Clone, Args)]
pub struct PruningParams {
#[arg(alias = "pruning", long, value_name = "PRUNING_MODE")]
pub state_pruning: Option<DatabasePruningMode>,
#[arg(
alias = "keep-blocks",
long,
value_name = "PRUNING_MODE",
default_value = "archive-canonical"
)]
pub blocks_pruning: DatabasePruningMode,
}
impl PruningParams {
pub fn state_pruning(&self) -> error::Result<Option<PruningMode>> {
Ok(self.state_pruning.map(|v| v.into()))
}
pub fn blocks_pruning(&self) -> error::Result<BlocksPruning> {
Ok(self.blocks_pruning.into())
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum DatabasePruningMode {
Archive,
ArchiveCanonical,
Custom(u32),
}
impl std::str::FromStr for DatabasePruningMode {
type Err = String;
fn from_str(input: &str) -> Result<Self, Self::Err> {
match input {
"archive" => Ok(Self::Archive),
"archive-canonical" => Ok(Self::ArchiveCanonical),
bc => bc
.parse()
.map_err(|_| "Invalid pruning mode specified".to_string())
.map(Self::Custom),
}
}
}
impl Into<PruningMode> for DatabasePruningMode {
fn into(self) -> PruningMode {
match self {
DatabasePruningMode::Archive => PruningMode::ArchiveAll,
DatabasePruningMode::ArchiveCanonical => PruningMode::ArchiveCanonical,
DatabasePruningMode::Custom(n) => PruningMode::blocks_pruning(n),
}
}
}
impl Into<BlocksPruning> for DatabasePruningMode {
fn into(self) -> BlocksPruning {
match self {
DatabasePruningMode::Archive => BlocksPruning::KeepAll,
DatabasePruningMode::ArchiveCanonical => BlocksPruning::KeepFinalized,
DatabasePruningMode::Custom(n) => BlocksPruning::Some(n),
}
}
}