sc_cli/params/
pruning_params.rs1use crate::error;
20use clap::Args;
21use sc_service::{BlocksPruning, PruningMode};
22
23#[derive(Debug, Clone, Args)]
25pub struct PruningParams {
26 #[arg(alias = "pruning", long, value_name = "PRUNING_MODE")]
46 pub state_pruning: Option<DatabasePruningMode>,
47
48 #[arg(
61 alias = "keep-blocks",
62 long,
63 value_name = "PRUNING_MODE",
64 default_value = "archive-canonical"
65 )]
66 pub blocks_pruning: DatabasePruningMode,
67}
68
69impl PruningParams {
70 pub fn state_pruning(&self) -> error::Result<Option<PruningMode>> {
72 Ok(self.state_pruning.map(|v| v.into()))
73 }
74
75 pub fn blocks_pruning(&self) -> error::Result<BlocksPruning> {
77 Ok(self.blocks_pruning.into())
78 }
79}
80
81#[derive(Debug, Clone, Copy, PartialEq)]
87pub enum DatabasePruningMode {
88 Archive,
90 ArchiveCanonical,
92 Custom(u32),
94}
95
96impl std::str::FromStr for DatabasePruningMode {
97 type Err = String;
98
99 fn from_str(input: &str) -> Result<Self, Self::Err> {
100 match input {
101 "archive" => Ok(Self::Archive),
102 "archive-canonical" => Ok(Self::ArchiveCanonical),
103 bc => bc
104 .parse()
105 .map_err(|_| "Invalid pruning mode specified".to_string())
106 .map(Self::Custom),
107 }
108 }
109}
110
111impl Into<PruningMode> for DatabasePruningMode {
112 fn into(self) -> PruningMode {
113 match self {
114 DatabasePruningMode::Archive => PruningMode::ArchiveAll,
115 DatabasePruningMode::ArchiveCanonical => PruningMode::ArchiveCanonical,
116 DatabasePruningMode::Custom(n) => PruningMode::blocks_pruning(n),
117 }
118 }
119}
120
121impl Into<BlocksPruning> for DatabasePruningMode {
122 fn into(self) -> BlocksPruning {
123 match self {
124 DatabasePruningMode::Archive => BlocksPruning::KeepAll,
125 DatabasePruningMode::ArchiveCanonical => BlocksPruning::KeepFinalized,
126 DatabasePruningMode::Custom(n) => BlocksPruning::Some(n),
127 }
128 }
129}
130
131#[cfg(test)]
132mod tests {
133 use super::*;
134 use clap::Parser;
135
136 #[derive(Parser)]
137 struct Cli {
138 #[clap(flatten)]
139 pruning: PruningParams,
140 }
141
142 #[test]
143 fn pruning_params_parse_works() {
144 let Cli { pruning } =
145 Cli::parse_from(["", "--state-pruning=1000", "--blocks-pruning=1000"]);
146
147 assert!(matches!(pruning.state_pruning, Some(DatabasePruningMode::Custom(1000))));
148 assert!(matches!(pruning.blocks_pruning, DatabasePruningMode::Custom(1000)));
149
150 let Cli { pruning } =
151 Cli::parse_from(["", "--state-pruning=archive", "--blocks-pruning=archive"]);
152
153 assert!(matches!(dbg!(pruning.state_pruning), Some(DatabasePruningMode::Archive)));
154 assert!(matches!(pruning.blocks_pruning, DatabasePruningMode::Archive));
155
156 let Cli { pruning } = Cli::parse_from([
157 "",
158 "--state-pruning=archive-canonical",
159 "--blocks-pruning=archive-canonical",
160 ]);
161
162 assert!(matches!(dbg!(pruning.state_pruning), Some(DatabasePruningMode::ArchiveCanonical)));
163 assert!(matches!(pruning.blocks_pruning, DatabasePruningMode::ArchiveCanonical));
164 }
165}