use std::time::Duration;
#[derive(Debug, Clone, Default, PartialEq, Eq)]
#[non_exhaustive]
pub struct StartupTimings {
pub program_resolve_ms: Option<u64>,
pub process_spawn_ms: Option<u64>,
pub port_wait_ms: Option<u64>,
pub transport_setup_ms: u64,
pub handshake_ms: u64,
pub session_fs_ms: Option<u64>,
pub llm_handler_ms: Option<u64>,
pub total_ms: u64,
}
impl StartupTimings {
pub(crate) fn millis(duration: Duration) -> u64 {
u64::try_from(duration.as_millis()).unwrap_or(u64::MAX)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn millis_truncates_to_whole_milliseconds() {
assert_eq!(StartupTimings::millis(Duration::from_micros(1_999)), 1);
assert_eq!(StartupTimings::millis(Duration::from_millis(250)), 250);
assert_eq!(StartupTimings::millis(Duration::ZERO), 0);
}
#[test]
fn default_leaves_every_phase_unset() {
let timings = StartupTimings::default();
assert_eq!(timings, StartupTimings::default());
assert!(timings.program_resolve_ms.is_none());
assert!(timings.process_spawn_ms.is_none());
assert!(timings.port_wait_ms.is_none());
assert_eq!(timings.transport_setup_ms, 0);
assert_eq!(timings.handshake_ms, 0);
assert!(timings.session_fs_ms.is_none());
assert!(timings.llm_handler_ms.is_none());
assert_eq!(timings.total_ms, 0);
}
}