mod apt_mirror;
pub(crate) mod command;
pub(crate) mod environment;
mod executor;
pub(crate) mod install;
pub(crate) mod managed_cargo;
pub(crate) mod managed_git;
pub(crate) mod policy;
pub(crate) mod retry;
pub(crate) mod runtime;
pub(crate) mod scheduler;
pub(crate) mod verifier;
mod windows_job;
use crate::events::{LifecycleEvent, emit as emit_lifecycle, is_active};
use crate::ui::{progress_completed, progress_started, progress_update};
#[cfg(test)]
pub(crate) static TEST_ENV_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(());
pub(crate) enum ExecutionEvent {
Started {
step: usize,
total: usize,
component: String,
},
Progress {
step: usize,
total: usize,
component: String,
elapsed_secs: u64,
recent: String,
},
Completed {
step: usize,
total: usize,
component: String,
elapsed_secs: u64,
},
}
impl ExecutionEvent {
pub(crate) fn lifecycle(&self) -> LifecycleEvent {
match self {
Self::Started { .. } => LifecycleEvent::Queued,
Self::Progress {
elapsed_secs,
recent,
..
} => LifecycleEvent::Progress {
elapsed_ms: u128::from(*elapsed_secs) * 1000,
message: recent.clone(),
},
Self::Completed { elapsed_secs, .. } => LifecycleEvent::Completed {
elapsed_ms: u128::from(*elapsed_secs) * 1000,
},
}
}
}
pub(crate) trait EventSink {
fn emit(&mut self, event: &ExecutionEvent);
}
pub(crate) struct UiEventSink;
impl EventSink for UiEventSink {
fn emit(&mut self, event: &ExecutionEvent) {
let component = match event {
ExecutionEvent::Started { component, .. }
| ExecutionEvent::Progress { component, .. }
| ExecutionEvent::Completed { component, .. } => component,
};
emit_lifecycle(None, Some(component), None, event.lifecycle());
if !is_active() {
match event {
ExecutionEvent::Started {
step,
total,
component,
} => progress_started(*step, *total, component),
ExecutionEvent::Progress {
step,
total,
component,
elapsed_secs,
recent,
} => progress_update(*step, *total, component, *elapsed_secs, recent),
ExecutionEvent::Completed {
step,
total,
component,
elapsed_secs,
} => progress_completed(*step, *total, component, *elapsed_secs),
}
}
}
}
pub use crate::execution::executor::{ExecutionSelection, PreparedExecution, execute, select};
pub use crate::execution::verifier::preview_plan;