use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BackupConfig {
#[serde(default)]
pub schedule: Option<String>,
#[serde(default = "default_retention_days")]
pub retention_days: u32,
#[serde(default)]
pub targets: Vec<BackupTarget>,
}
fn default_retention_days() -> u32 {
30
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "lowercase")]
pub enum BackupTarget {
Local {
path: String,
},
S3 {
bucket: String,
region: String,
#[serde(default)]
prefix: Option<String>,
#[serde(default)]
endpoint: Option<String>,
#[serde(default)]
access_key: Option<String>,
#[serde(default)]
secret_key: Option<String>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServiceBackupConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default)]
pub pre_hook: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parse_backup_config() {
let toml = r#"
schedule = "0 0 2 * * *"
retention_days = 7
[[targets]]
type = "local"
path = "/backups"
[[targets]]
type = "s3"
bucket = "my-backups"
region = "eu-central-1"
prefix = "orca/"
"#;
let config: BackupConfig = toml::from_str(toml).unwrap();
assert_eq!(config.retention_days, 7);
assert_eq!(config.targets.len(), 2);
}
}