#[derive(Clone, Debug, PartialEq, Eq)]
pub struct SfuConfig {
pub udp_port: u16,
pub metrics_port: u16,
pub bind_address: String,
pub log_level: String,
}
impl Default for SfuConfig {
fn default() -> Self {
Self {
udp_port: 3478,
metrics_port: 9317,
bind_address: "0.0.0.0".to_string(),
log_level: "info".to_string(),
}
}
}
impl SfuConfig {
pub fn from_env() -> Self {
let defaults = Self::default();
Self {
udp_port: env("SFU_UDP_PORT", &defaults.udp_port.to_string())
.parse()
.expect("SFU_UDP_PORT must be a number"),
metrics_port: env("SFU_METRICS_PORT", &defaults.metrics_port.to_string())
.parse()
.expect("SFU_METRICS_PORT must be a number"),
bind_address: env("SFU_BIND_ADDRESS", &defaults.bind_address),
log_level: env("RUST_LOG", &defaults.log_level),
}
}
}
fn env(key: &str, default: &str) -> String {
std::env::var(key).unwrap_or_else(|_| default.to_string())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_is_sensible() {
let cfg = SfuConfig::default();
assert_eq!(cfg.bind_address, "0.0.0.0");
assert_eq!(cfg.udp_port, 3478);
assert_ne!(cfg.udp_port, cfg.metrics_port);
}
}