use crate::error;
use clap::Args;
use pezsc_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),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use clap::Parser;
#[derive(Parser)]
struct Cli {
#[clap(flatten)]
pruning: PruningParams,
}
#[test]
fn pruning_params_parse_works() {
let Cli { pruning } =
Cli::parse_from(["", "--state-pruning=1000", "--blocks-pruning=1000"]);
assert!(matches!(pruning.state_pruning, Some(DatabasePruningMode::Custom(1000))));
assert!(matches!(pruning.blocks_pruning, DatabasePruningMode::Custom(1000)));
let Cli { pruning } =
Cli::parse_from(["", "--state-pruning=archive", "--blocks-pruning=archive"]);
assert!(matches!(dbg!(pruning.state_pruning), Some(DatabasePruningMode::Archive)));
assert!(matches!(pruning.blocks_pruning, DatabasePruningMode::Archive));
let Cli { pruning } = Cli::parse_from([
"",
"--state-pruning=archive-canonical",
"--blocks-pruning=archive-canonical",
]);
assert!(matches!(dbg!(pruning.state_pruning), Some(DatabasePruningMode::ArchiveCanonical)));
assert!(matches!(pruning.blocks_pruning, DatabasePruningMode::ArchiveCanonical));
}
}