canic-host 0.106.0

Host-side App build, Fleet install, deployment, and release-set library for Canic workspaces
Documentation
use super::timing::{InstallTimingLabel, InstallTimingSummary};
use crate::table::{ColumnAlign, render_bordered_table};
use std::time::Duration;

pub(super) use crate::terminal::{TerminalActivity, TerminalStyle};

pub(super) fn print_install_timing_summary(timings: &InstallTimingSummary, total: Duration) {
    TerminalStyle::detected().print_section("Install complete", "timing summary");
    println!("{}", render_install_timing_summary(timings, total));
}

pub(super) fn render_install_timing_summary(
    timings: &InstallTimingSummary,
    total: Duration,
) -> String {
    let phase_rows = [
        (InstallTimingLabel::PREFLIGHT, timings.preflight),
        (
            InstallTimingLabel::BUILD_CONFIGURED,
            timings.build_configured,
        ),
        (
            InstallTimingLabel::BUILD_INFRASTRUCTURE,
            timings.build_infrastructure,
        ),
        (
            InstallTimingLabel::MATERIALIZE_ARTIFACTS,
            timings.materialize_artifacts,
        ),
        (InstallTimingLabel::REUSE_ARTIFACTS, timings.reuse_artifacts),
        (InstallTimingLabel::POST_BUILD_GATE, timings.post_build_gate),
        (InstallTimingLabel::EMIT_MANIFEST, timings.emit_manifest),
        (InstallTimingLabel::ACTIVATE_FLEET, timings.activate_fleet),
    ]
    .into_iter()
    .map(|(label, duration)| (label, duration_centiseconds(duration)))
    .filter(|(_, centiseconds)| *centiseconds != 0)
    .collect::<Vec<_>>();
    let total_centiseconds = duration_centiseconds(total);
    let measured_centiseconds = phase_rows
        .iter()
        .map(|(_, centiseconds)| centiseconds)
        .sum::<u128>();
    let other_centiseconds = total_centiseconds.saturating_sub(measured_centiseconds);
    let rows = phase_rows
        .into_iter()
        .chain((other_centiseconds != 0).then_some((InstallTimingLabel::OTHER, other_centiseconds)))
        .chain([(InstallTimingLabel::TOTAL, total_centiseconds)])
        .map(|(label, centiseconds)| timing_row(label, centiseconds))
        .collect::<Vec<_>>();
    render_bordered_table(
        &["PHASE", "ELAPSED"],
        &rows,
        &[ColumnAlign::Left, ColumnAlign::Right],
    )
}

const fn duration_centiseconds(duration: Duration) -> u128 {
    duration.as_millis() / 10
}

fn timing_row(label: InstallTimingLabel, centiseconds: u128) -> [String; 2] {
    [
        label.as_str().to_string(),
        format!("{}.{:02}s", centiseconds / 100, centiseconds % 100),
    ]
}