use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct NetworkStats {
#[serde(rename = "BytesSent")]
pub bytes_sent: u64,
#[serde(rename = "BytesReceived")]
pub bytes_received: u64,
#[serde(rename = "TCP")]
pub tcp: TcpStats,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct TcpStats {
#[serde(rename = "ForwardMaxInFlightDrop")]
pub forward_max_inflight_drop: u64,
#[serde(rename = "CurrentEstablished")]
pub current_established: u64,
#[serde(rename = "FailedConnectionAttempts")]
pub failed_connection_attempts: u64,
#[serde(rename = "Retransmits")]
pub retransmits: u64,
#[serde(rename = "Timeouts")]
pub timeouts: u64,
}
impl NetworkStats {
pub fn from_json_str(json: &str) -> Result<Self, serde_json::Error> {
serde_json::from_str(json)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_deserialize_network_stats() {
let json = r#"{
"BytesSent": 1024,
"BytesReceived": 2048,
"TCP": {
"ForwardMaxInFlightDrop": 100,
"CurrentEstablished": 5,
"FailedConnectionAttempts": 2,
"Retransmits": 10,
"Timeouts": 1
}
}"#;
let stats = NetworkStats::from_json_str(json).unwrap();
assert_eq!(stats.bytes_sent, 1024);
assert_eq!(stats.tcp.forward_max_inflight_drop, 100);
}
#[test]
fn test_deserialize_invalid_json() {
let result = NetworkStats::from_json_str("invalid");
assert!(result.is_err());
}
#[test]
fn test_stats_equality() {
let stats1 = NetworkStats {
bytes_sent: 1024,
bytes_received: 2048,
tcp: TcpStats {
forward_max_inflight_drop: 0,
current_established: 1,
failed_connection_attempts: 0,
retransmits: 0,
timeouts: 0,
},
};
let stats2 = stats1.clone();
assert_eq!(stats1, stats2);
}
}