use serde::{Deserialize, Serialize};
use super::retry::RetryPolicy;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SyncConfig {
#[serde(default = "default_max_attempts")]
pub max_attempts: u32,
#[serde(default = "default_concurrency")]
pub concurrency: usize,
}
fn default_max_attempts() -> u32 {
RetryPolicy::DEFAULT_MAX_ATTEMPTS
}
fn default_concurrency() -> usize {
8
}
impl Default for SyncConfig {
fn default() -> Self {
Self {
max_attempts: default_max_attempts(),
concurrency: default_concurrency(),
}
}
}
impl SyncConfig {
pub fn retry_policy(&self) -> RetryPolicy {
RetryPolicy::new(self.max_attempts)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_values() {
let cfg = SyncConfig::default();
assert_eq!(cfg.max_attempts, 3);
assert_eq!(cfg.concurrency, 8);
}
#[test]
fn retry_policy_derived() {
let cfg = SyncConfig {
max_attempts: 5,
..Default::default()
};
assert_eq!(cfg.retry_policy().max_attempts(), 5);
}
#[test]
fn serde_roundtrip() {
let cfg = SyncConfig {
max_attempts: 7,
concurrency: 16,
};
let json = serde_json::to_string(&cfg).expect("serialize");
let restored: SyncConfig = serde_json::from_str(&json).expect("deserialize");
assert_eq!(restored.max_attempts, 7);
assert_eq!(restored.concurrency, 16);
}
#[test]
fn serde_defaults_on_missing_fields() {
let json = "{}";
let cfg: SyncConfig = serde_json::from_str(json).expect("deserialize");
assert_eq!(cfg.max_attempts, 3);
assert_eq!(cfg.concurrency, 8);
}
#[test]
fn zero_max_attempts_clamped() {
let cfg = SyncConfig {
max_attempts: 0,
..Default::default()
};
assert_eq!(cfg.retry_policy().max_attempts(), 1);
}
}