use std::fmt;
use serde::Serialize;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Network {
Database,
Metrics,
Visualization,
Proxy,
}
impl Network {
#[must_use]
pub fn name(&self) -> &'static str {
match self {
Network::Database => "database_network",
Network::Metrics => "metrics_network",
Network::Visualization => "visualization_network",
Network::Proxy => "proxy_network",
}
}
#[must_use]
pub fn driver(&self) -> &'static str {
"bridge"
}
#[must_use]
pub fn description(&self) -> &'static str {
match self {
Network::Database => "Database isolation: Tracker ↔ MySQL",
Network::Metrics => "Metrics scraping: Tracker ↔ Prometheus",
Network::Visualization => "Dashboard queries: Prometheus ↔ Grafana",
Network::Proxy => "TLS termination: Caddy ↔ backend services",
}
}
#[must_use]
pub fn all() -> &'static [Network] {
&[
Network::Database,
Network::Metrics,
Network::Visualization,
Network::Proxy,
]
}
}
impl fmt::Display for Network {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.name())
}
}
impl Serialize for Network {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_str(self.name())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_should_return_correct_network_name_for_database() {
assert_eq!(Network::Database.name(), "database_network");
}
#[test]
fn it_should_return_correct_network_name_for_metrics() {
assert_eq!(Network::Metrics.name(), "metrics_network");
}
#[test]
fn it_should_return_correct_network_name_for_visualization() {
assert_eq!(Network::Visualization.name(), "visualization_network");
}
#[test]
fn it_should_return_correct_network_name_for_proxy() {
assert_eq!(Network::Proxy.name(), "proxy_network");
}
#[test]
fn it_should_return_bridge_driver_for_database_network() {
assert_eq!(Network::Database.driver(), "bridge");
}
#[test]
fn it_should_return_bridge_driver_for_metrics_network() {
assert_eq!(Network::Metrics.driver(), "bridge");
}
#[test]
fn it_should_return_bridge_driver_for_visualization_network() {
assert_eq!(Network::Visualization.driver(), "bridge");
}
#[test]
fn it_should_return_bridge_driver_for_proxy_network() {
assert_eq!(Network::Proxy.driver(), "bridge");
}
#[test]
fn it_should_display_network_as_name() {
assert_eq!(format!("{}", Network::Database), "database_network");
assert_eq!(format!("{}", Network::Metrics), "metrics_network");
assert_eq!(
format!("{}", Network::Visualization),
"visualization_network"
);
assert_eq!(format!("{}", Network::Proxy), "proxy_network");
}
#[test]
fn it_should_serialize_network_to_name_string() {
let json = serde_json::to_string(&Network::Metrics).unwrap();
assert_eq!(json, "\"metrics_network\"");
}
#[test]
fn it_should_serialize_all_networks_correctly() {
assert_eq!(
serde_json::to_string(&Network::Database).unwrap(),
"\"database_network\""
);
assert_eq!(
serde_json::to_string(&Network::Metrics).unwrap(),
"\"metrics_network\""
);
assert_eq!(
serde_json::to_string(&Network::Visualization).unwrap(),
"\"visualization_network\""
);
assert_eq!(
serde_json::to_string(&Network::Proxy).unwrap(),
"\"proxy_network\""
);
}
#[test]
fn it_should_return_all_four_networks() {
let all = Network::all();
assert_eq!(all.len(), 4);
assert!(all.contains(&Network::Database));
assert!(all.contains(&Network::Metrics));
assert!(all.contains(&Network::Visualization));
assert!(all.contains(&Network::Proxy));
}
#[test]
fn it_should_compare_networks_for_equality() {
assert_eq!(Network::Database, Network::Database);
assert_ne!(Network::Database, Network::Metrics);
}
#[test]
fn it_should_be_copyable() {
let network = Network::Metrics;
let copied = network; assert_eq!(network, copied);
}
#[test]
fn it_should_be_clonable() {
let network = Network::Metrics;
#[allow(clippy::clone_on_copy)]
let cloned = network.clone();
assert_eq!(network, cloned);
}
#[test]
fn it_should_be_hashable() {
use std::collections::HashSet;
let mut set = HashSet::new();
set.insert(Network::Database);
set.insert(Network::Metrics);
set.insert(Network::Database);
assert_eq!(set.len(), 2);
assert!(set.contains(&Network::Database));
assert!(set.contains(&Network::Metrics));
}
#[test]
fn it_should_return_description_for_database_network() {
assert_eq!(
Network::Database.description(),
"Database isolation: Tracker ↔ MySQL"
);
}
#[test]
fn it_should_return_description_for_metrics_network() {
assert_eq!(
Network::Metrics.description(),
"Metrics scraping: Tracker ↔ Prometheus"
);
}
#[test]
fn it_should_return_description_for_visualization_network() {
assert_eq!(
Network::Visualization.description(),
"Dashboard queries: Prometheus ↔ Grafana"
);
}
#[test]
fn it_should_return_description_for_proxy_network() {
assert_eq!(
Network::Proxy.description(),
"TLS termination: Caddy ↔ backend services"
);
}
}