pub fn next_grid_tick_magnitude_nanos(spacing_nanos: i64) -> i64 {
if spacing_nanos <= 1_000_000_000 {
spacing_nanos * 10 } else if spacing_nanos == 10_000_000_000 {
spacing_nanos * 6 } else if spacing_nanos == 60_000_000_000 {
spacing_nanos * 10 } else if spacing_nanos == 600_000_000_000 {
spacing_nanos * 6 } else if spacing_nanos == 60 * 60 * 1_000_000_000 {
spacing_nanos * 12 } else if spacing_nanos == 12 * 60 * 60 * 1_000_000_000 {
spacing_nanos * 2 } else {
spacing_nanos.checked_mul(10).unwrap_or(spacing_nanos) }
}
pub fn format_timestamp_secs(timestamp_secs: f64) -> String {
let n = timestamp_secs as i32;
let hours = n / (60 * 60);
let mins = (n / 60) % 60;
let secs = (n % 60) as f64 + timestamp_secs.fract();
if hours > 0 {
format!("{hours:02}:{mins:02}:{secs:02.02}")
} else {
format!("{mins:02}:{secs:02.02}")
}
}
pub fn parse_timestamp_secs(s: &str) -> Option<f64> {
let parts: Vec<&str> = s.split(':').collect();
match parts.len() {
1 => parts[0].parse::<f64>().ok(),
2 => {
let minutes = parts[0].parse::<i32>().ok()?;
let seconds = parts[1].parse::<f64>().ok()?;
Some((minutes * 60) as f64 + seconds)
}
3 => {
let hours = parts[0].parse::<i32>().ok()?;
let minutes = parts[0].parse::<i32>().ok()?;
let seconds = parts[1].parse::<f64>().ok()?;
Some(((hours * 60 + minutes) * 60) as f64 + seconds)
}
_ => None,
}
}