use faucet_core::FaucetError;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
pub const DEFAULT_RETAIN: usize = 10;
fn default_true() -> bool {
true
}
fn default_retain() -> usize {
DEFAULT_RETAIN
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
#[serde(deny_unknown_fields)]
pub struct RollbackSpec {
#[serde(default = "default_true")]
pub enabled: bool,
#[serde(default = "default_true")]
pub journal: bool,
#[serde(default = "default_true")]
pub keep_previous: bool,
#[serde(default = "default_retain")]
pub retain: usize,
}
impl Default for RollbackSpec {
fn default() -> Self {
Self {
enabled: true,
journal: true,
keep_previous: true,
retain: DEFAULT_RETAIN,
}
}
}
impl RollbackSpec {
pub fn validate(&self) -> Result<(), FaucetError> {
if self.retain == 0 {
return Err(FaucetError::Config(
"rollback: `retain` must be at least 1 (set `enabled: false` to turn rollback off)"
.into(),
));
}
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn defaults_and_validation() {
let spec: RollbackSpec = serde_yaml::from_str("{}").unwrap();
assert_eq!(spec, RollbackSpec::default());
assert!(spec.enabled && spec.journal && spec.keep_previous);
assert_eq!(spec.retain, 10);
spec.validate().unwrap();
let bad = RollbackSpec {
retain: 0,
..RollbackSpec::default()
};
assert!(bad.validate().unwrap_err().to_string().contains("retain"));
assert!(serde_yaml::from_str::<RollbackSpec>("journals: true").is_err());
}
}