pub fn format_duration_millis(millis: i64) -> String {
if millis < 0 {
return "0 ms".to_string();
}
if millis < 1000 {
return format!("{} ms", millis);
}
let total_seconds = millis / 1000;
let hours = total_seconds / 3600;
let minutes = (total_seconds % 3600) / 60;
let seconds = total_seconds % 60;
if hours > 0 {
if minutes > 0 && seconds > 0 {
format!("{}h {}m {}s", hours, minutes, seconds)
} else if minutes > 0 {
format!("{}h {}m", hours, minutes)
} else if seconds > 0 {
format!("{}h {}s", hours, seconds)
} else {
format!("{}h", hours)
}
} else if minutes > 0 {
if seconds > 0 {
format!("{}m {}s", minutes, seconds)
} else {
format!("{}m", minutes)
}
} else {
let millis_part = millis % 1000;
if millis_part > 0 {
format!("{}.{}s", seconds, millis_part / 100)
} else {
format!("{}s", seconds)
}
}
}
pub fn format_duration_nanos(nanos: i128) -> String {
if nanos < 0 {
return "0 ns".to_string();
}
if nanos < 1000 {
return format!("{} ns", nanos);
}
if nanos < 1_000_000 {
let micros = nanos / 1000;
let nanos_part = nanos % 1000;
if nanos_part > 0 {
format!("{}.{} μs", micros, nanos_part / 100)
} else {
format!("{} μs", micros)
}
} else if nanos < 1_000_000_000 {
let millis = nanos / 1_000_000;
let micros_part = (nanos % 1_000_000) / 100_000;
if micros_part > 0 {
format!("{}.{} ms", millis, micros_part)
} else {
format!("{} ms", millis)
}
} else {
let millis = (nanos / 1_000_000) as i64;
format_duration_millis(millis)
}
}
pub fn format_speed(speed: f64, unit: &str) -> String {
if speed.is_nan() || speed.is_infinite() {
"N/A".to_string()
} else {
format!("{:.2}{}", speed, unit)
}
}