use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OperationMetrics {
pub compression_time_micros: u64,
pub compression_ratio: f64,
pub checksum_time_micros: u64,
pub encryption_time_micros: Option<u64>,
pub hardware_accelerated: bool,
}
impl OperationMetrics {
pub fn new() -> Self {
OperationMetrics {
compression_time_micros: 0,
compression_ratio: 1.0,
checksum_time_micros: 0,
encryption_time_micros: None,
hardware_accelerated: false,
}
}
pub fn with_compression(
mut self,
time_micros: u64,
original_size: usize,
compressed_size: usize,
) -> Self {
self.compression_time_micros = time_micros;
if compressed_size > 0 {
self.compression_ratio = original_size as f64 / compressed_size as f64;
}
self
}
pub fn with_checksum(mut self, time_micros: u64) -> Self {
self.checksum_time_micros = time_micros;
self
}
pub fn with_encryption(mut self, time_micros: u64, hw_accel: bool) -> Self {
self.encryption_time_micros = Some(time_micros);
self.hardware_accelerated = hw_accel;
self
}
pub fn total_time_micros(&self) -> u64 {
let mut total = self.compression_time_micros + self.checksum_time_micros;
if let Some(enc_time) = self.encryption_time_micros {
total += enc_time;
}
total
}
}
impl Default for OperationMetrics {
fn default() -> Self {
Self::new()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_metrics_creation() {
let metrics = OperationMetrics::new();
assert_eq!(metrics.compression_time_micros, 0);
assert_eq!(metrics.checksum_time_micros, 0);
assert_eq!(metrics.compression_ratio, 1.0);
assert_eq!(metrics.encryption_time_micros, None);
}
#[test]
fn test_compression_metrics() {
let metrics = OperationMetrics::new().with_compression(100, 1000, 250);
assert_eq!(metrics.compression_time_micros, 100);
assert!((metrics.compression_ratio - 4.0).abs() < 0.01); }
#[test]
fn test_total_time() {
let metrics = OperationMetrics::new()
.with_compression(100, 1000, 250)
.with_checksum(50)
.with_encryption(200, true);
assert_eq!(metrics.total_time_micros(), 350); }
}