spider_util/
formatters.rs1use std::time::Duration;
7
8pub trait DurationFormatter {
10 fn formatted_duration(&self, duration: Duration) -> String;
12
13 fn formatted_request_time(&self, duration: Option<Duration>) -> String;
15}
16
17pub struct DefaultDurationFormatter;
19
20impl DurationFormatter for DefaultDurationFormatter {
21 fn formatted_duration(&self, duration: Duration) -> String {
22 format!("{:?}", duration)
23 }
24
25 fn formatted_request_time(&self, duration: Option<Duration>) -> String {
26 match duration {
27 Some(d) => {
28 if d.as_millis() < 1000 {
29 format!("{} ms", d.as_millis())
30 } else {
31 format!("{:.2} s", d.as_secs_f64())
32 }
33 }
34 None => "N/A".to_string(),
35 }
36 }
37}
38
39pub trait ByteFormatter {
41 fn formatted_bytes(&self, bytes: usize) -> String;
43}
44
45pub struct DefaultByteFormatter;
47
48impl ByteFormatter for DefaultByteFormatter {
49 fn formatted_bytes(&self, bytes: usize) -> String {
50 const KB: usize = 1024;
51 const MB: usize = 1024 * KB;
52 const GB: usize = 1024 * MB;
53
54 if bytes >= GB {
55 format!("{:.2} GB", bytes as f64 / GB as f64)
56 } else if bytes >= MB {
57 format!("{:.2} MB", bytes as f64 / MB as f64)
58 } else if bytes >= KB {
59 format!("{:.2} KB", bytes as f64 / KB as f64)
60 } else {
61 format!("{} B", bytes)
62 }
63 }
64}
65
66pub trait RateCalculator {
68 fn calculate_rate(&self, count: usize, elapsed: Duration) -> f64;
70}
71
72pub struct DefaultRateCalculator;
74
75impl RateCalculator for DefaultRateCalculator {
76 fn calculate_rate(&self, count: usize, elapsed: Duration) -> f64 {
77 let elapsed = elapsed.as_secs_f64();
78 if elapsed > 0.0 {
79 count as f64 / elapsed
80 } else {
81 0.0
82 }
83 }
84}
85
86pub fn format_duration(duration: Duration) -> String {
92 DefaultDurationFormatter.formatted_duration(duration)
93}
94
95pub fn format_request_time(duration: Option<Duration>) -> String {
97 DefaultDurationFormatter.formatted_request_time(duration)
98}
99
100pub fn format_bytes(bytes: usize) -> String {
102 DefaultByteFormatter.formatted_bytes(bytes)
103}
104
105pub fn calculate_rate(count: usize, elapsed: Duration) -> f64 {
107 DefaultRateCalculator.calculate_rate(count, elapsed)
108}