use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub enum DestinationConfig {
Filesystem {
path: PathBuf,
},
#[cfg(feature = "s3-backup")]
S3 {
bucket: String,
prefix: String,
endpoint: String,
},
}
impl Default for DestinationConfig {
fn default() -> Self {
DestinationConfig::Filesystem {
path: std::env::temp_dir().join("oxirs_backups"),
}
}
}
impl DestinationConfig {
pub fn local_path(&self) -> Option<&PathBuf> {
match self {
DestinationConfig::Filesystem { path } => Some(path),
#[cfg(feature = "s3-backup")]
DestinationConfig::S3 { .. } => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::env;
#[test]
fn default_destination_is_filesystem() {
let d = DestinationConfig::default();
assert!(d.local_path().is_some());
}
#[test]
fn filesystem_destination_local_path() {
let path = env::temp_dir().join("test_backup");
let d = DestinationConfig::Filesystem { path: path.clone() };
assert_eq!(d.local_path(), Some(&path));
}
#[test]
fn filesystem_destination_serialises() {
let path = env::temp_dir().join("backup_ser_test");
let d = DestinationConfig::Filesystem { path: path.clone() };
let json = serde_json::to_string(&d).unwrap();
let back: DestinationConfig = serde_json::from_str(&json).unwrap();
assert_eq!(back.local_path(), Some(&path));
}
}