use serde::{Deserialize, Serialize};
#[cfg(feature = "governance")]
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct GovernanceConfig {
#[serde(default = "crate::config::default_false")]
pub enabled: bool,
#[serde(default)]
pub commons_url: Option<String>,
#[serde(default)]
pub api_key: Option<String>,
}
#[cfg(feature = "governance")]
impl GovernanceConfig {
pub fn resolved_api_key(&self) -> Option<String> {
self.api_key
.clone()
.filter(|key| !key.is_empty())
.or_else(|| {
std::env::var("COMMONS_API_KEY")
.ok()
.filter(|key| !key.is_empty())
})
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BanListSharingConfig {
#[serde(default = "crate::config::default_true")]
pub enabled: bool,
#[serde(default = "default_ban_share_mode")]
pub share_mode: BanShareMode,
#[serde(default = "default_periodic_interval")]
pub periodic_interval_seconds: u64,
#[serde(default = "default_min_ban_duration")]
pub min_ban_duration_to_share: u64,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum BanShareMode {
Immediate,
Periodic,
Disabled,
}
fn default_ban_share_mode() -> BanShareMode {
BanShareMode::Periodic
}
fn default_periodic_interval() -> u64 {
300 }
fn default_min_ban_duration() -> u64 {
3600 }
impl Default for BanListSharingConfig {
fn default() -> Self {
Self {
enabled: true,
share_mode: BanShareMode::Periodic,
periodic_interval_seconds: 300,
min_ban_duration_to_share: 3600,
}
}
}
impl BanListSharingConfig {
pub fn shares(&self) -> bool {
self.enabled && !matches!(self.share_mode, BanShareMode::Disabled)
}
}