mod default;
pub use default::default_port_mappings;
use std::collections::HashMap;
#[derive(Debug, Clone)]
pub struct AppRegistry {
port_to_app: HashMap<u16, String>,
}
impl Default for AppRegistry {
fn default() -> Self {
Self::new()
}
}
impl AppRegistry {
pub fn new() -> Self {
Self {
port_to_app: default_port_mappings(),
}
}
pub fn with_mappings(custom_mappings: HashMap<u16, String>) -> Self {
let mut registry = Self::new();
for (port, name) in custom_mappings {
registry.port_to_app.insert(port, name);
}
registry
}
pub fn register(&mut self, port: u16, app_name: String) {
self.port_to_app.insert(port, app_name);
}
pub fn get_app_name(&self, port: u16) -> Option<&String> {
self.port_to_app.get(&port)
}
pub fn get_app_name_or_default(&self, port: u16) -> String {
self.get_app_name(port)
.cloned()
.unwrap_or_else(|| format!("Port-{}", port))
}
pub fn get_ports_for_app(&self, app_name: &str) -> Vec<u16> {
self.port_to_app
.iter()
.filter(|(_, name)| name.as_str() == app_name)
.map(|(&port, _)| port)
.collect()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_registry_known_ports() {
let registry = AppRegistry::new();
assert_eq!(registry.get_app_name(80), Some(&"HTTP".to_string()));
assert_eq!(registry.get_app_name(443), Some(&"HTTPS".to_string()));
assert_eq!(registry.get_app_name(22), Some(&"SSH".to_string()));
}
#[test]
fn test_registry_unknown_port() {
let registry = AppRegistry::new();
assert_eq!(registry.get_app_name(9999), None);
}
#[test]
fn test_registry_get_or_default() {
let registry = AppRegistry::new();
assert_eq!(registry.get_app_name_or_default(80), "HTTP");
assert_eq!(registry.get_app_name_or_default(9999), "Port-9999");
}
#[test]
fn test_registry_get_ports_for_app() {
let registry = AppRegistry::new();
let http_ports = registry.get_ports_for_app("HTTP");
assert!(http_ports.contains(&80));
}
#[test]
fn test_registry_with_mappings() {
let mut custom = HashMap::new();
custom.insert(9999, "CustomApp".to_string());
let registry = AppRegistry::with_mappings(custom);
assert_eq!(registry.get_app_name(9999), Some(&"CustomApp".to_string()));
assert_eq!(registry.get_app_name(80), Some(&"HTTP".to_string()));
}
#[test]
fn test_registry_register() {
let mut registry = AppRegistry::new();
registry.register(9999, "CustomApp".to_string());
assert_eq!(registry.get_app_name(9999), Some(&"CustomApp".to_string()));
}
#[test]
fn test_registry_register_overrides_default() {
let mut registry = AppRegistry::new();
registry.register(80, "CustomHTTP".to_string());
assert_eq!(registry.get_app_name(80), Some(&"CustomHTTP".to_string()));
}
}