use std::collections::HashSet;
#[derive(Debug, Clone)]
pub struct GatewayConfig {
pub udp_port: u16,
pub domain_id: u32,
pub node_id: u8,
pub lora_to_wifi_topics: HashSet<String>,
pub wifi_to_lora_topics: HashSet<String>,
pub bridge_all_topics: bool,
pub max_messages_per_second: u32,
pub multicast_address: String,
pub enable_stats: bool,
pub stats_interval_secs: u64,
}
impl Default for GatewayConfig {
fn default() -> Self {
Self {
udp_port: 7400,
domain_id: 0,
node_id: 254,
lora_to_wifi_topics: HashSet::new(),
wifi_to_lora_topics: HashSet::new(),
bridge_all_topics: true,
max_messages_per_second: 100,
multicast_address: "239.255.0.1".to_string(),
enable_stats: true,
stats_interval_secs: 60,
}
}
}
impl GatewayConfig {
pub fn new() -> Self {
Self::default()
}
pub fn should_bridge_lora_to_wifi(&self, topic: &str) -> bool {
if self.bridge_all_topics {
return true;
}
self.lora_to_wifi_topics.contains(topic)
}
pub fn should_bridge_wifi_to_lora(&self, topic: &str) -> bool {
if self.bridge_all_topics {
return true;
}
self.wifi_to_lora_topics.contains(topic)
}
pub fn add_lora_to_wifi_topic(&mut self, topic: &str) {
self.lora_to_wifi_topics.insert(topic.to_string());
}
pub fn add_wifi_to_lora_topic(&mut self, topic: &str) {
self.wifi_to_lora_topics.insert(topic.to_string());
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_config() {
let config = GatewayConfig::default();
assert_eq!(config.udp_port, 7400);
assert!(config.bridge_all_topics);
}
#[test]
fn test_topic_filtering_bridge_all() {
let config = GatewayConfig {
bridge_all_topics: true,
..Default::default()
};
assert!(config.should_bridge_lora_to_wifi("Temperature"));
assert!(config.should_bridge_lora_to_wifi("AnyTopic"));
assert!(config.should_bridge_wifi_to_lora("Command"));
}
#[test]
fn test_topic_filtering_specific() {
let mut config = GatewayConfig {
bridge_all_topics: false,
..Default::default()
};
config.add_lora_to_wifi_topic("Temperature");
config.add_wifi_to_lora_topic("Command");
assert!(config.should_bridge_lora_to_wifi("Temperature"));
assert!(!config.should_bridge_lora_to_wifi("Humidity"));
assert!(config.should_bridge_wifi_to_lora("Command"));
assert!(!config.should_bridge_wifi_to_lora("Data"));
}
}