use super::AppState;
use crate::events::OperatorCommandEffect;
use crate::tui::events::LogEntry;
use crate::tui::types::{AppExecutionMode, StopMode};
impl AppState {
pub(crate) fn handle_operator_command_applied(&mut self, effect: OperatorCommandEffect) {
match effect {
OperatorCommandEffect::RunDispatched {
change_ids,
scheduler_started,
..
} => {
if scheduler_started
|| crate::events::accepted_start_opens_idle_run_episode(
self.execution_mode.app_mode_token(),
self.persistent_scheduler_idle,
scheduler_started,
&change_ids,
)
{
self.persistent_scheduler_idle = false;
self.begin_run(&change_ids);
} else {
self.queue_run(&change_ids);
}
}
OperatorCommandEffect::StopCancelled => {
self.stop_mode = StopMode::None;
self.execution_mode = if self.persistent_scheduler_idle {
AppExecutionMode::Select
} else {
AppExecutionMode::Running
};
}
OperatorCommandEffect::ForceStopAwaitingBoundary { force_stop } => {
if force_stop {
self.stop_mode = StopMode::ForceStopped;
}
self.execution_mode = AppExecutionMode::Stopping;
self.add_log(LogEntry::info(
"Waiting for in-flight work to reach a safe stop boundary...",
));
}
OperatorCommandEffect::MarkDelta { change_ids, marked } => {
for change_id in change_ids {
if let Some(change) = self.changes.iter_mut().find(|c| c.id == change_id) {
change.selected = marked;
}
}
}
OperatorCommandEffect::QueueDelta { .. } => {}
OperatorCommandEffect::ResolveReserved { change_id, active } => {
if let Some(change) = self.changes.iter_mut().find(|c| c.id == change_id) {
change.set_display_status_cache("resolve pending");
}
if active
&& matches!(
self.execution_mode,
AppExecutionMode::Select | AppExecutionMode::Stopped
)
{
self.execution_mode = AppExecutionMode::Running;
}
}
}
}
pub(crate) fn handle_stopping(&mut self) {
if crate::events::graceful_stop_is_idle_origin(self.execution_mode.app_mode_token()) {
self.persistent_scheduler_idle = true;
}
self.stop_mode = StopMode::GracefulPending;
self.execution_mode = AppExecutionMode::Stopping;
}
}