use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GossipConfig {
pub active_view_size: usize,
pub passive_view_size: usize,
pub arwl: usize,
pub prwl: usize,
}
impl Default for GossipConfig {
fn default() -> Self {
Self {
active_view_size: 6,
passive_view_size: 30,
arwl: 6,
prwl: 3,
}
}
}
impl GossipConfig {
pub fn validate(&self) -> Result<(), String> {
if self.active_view_size == 0 {
return Err("active_view_size must be > 0".to_string());
}
if self.passive_view_size == 0 {
return Err("passive_view_size must be > 0".to_string());
}
if self.arwl == 0 {
return Err("arwl must be > 0".to_string());
}
if self.prwl == 0 {
return Err("prwl must be > 0".to_string());
}
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_config() {
let config = GossipConfig::default();
assert_eq!(config.active_view_size, 6);
assert_eq!(config.passive_view_size, 30);
assert_eq!(config.arwl, 6);
assert_eq!(config.prwl, 3);
}
#[test]
fn test_config_validation() {
let valid = GossipConfig::default();
assert!(valid.validate().is_ok());
let invalid = GossipConfig {
active_view_size: 0,
..Default::default()
};
assert!(invalid.validate().is_err());
}
}