pub mod query;
use crate::{
InternalError,
dto::state::{FleetCommand, FleetCommandExecutionResponse},
ops::{
cascade_report::StateCascadeReportOps, runtime::env::EnvOps,
storage::state::fleet::FleetStateOps,
},
view::state_cascade::StateCascadeTarget,
workflow::{
cascade::{snapshot::StateSnapshotBuilder, state::StateCascadeWorkflow},
runtime::cycles::CycleWorkflow,
},
};
pub struct FleetStateWorkflow;
impl FleetStateWorkflow {
pub async fn execute_command_to(
cmd: FleetCommand,
root_children: &[StateCascadeTarget],
reconcile_funding: bool,
) -> Result<FleetCommandExecutionResponse, InternalError> {
EnvOps::require_root()?;
let builder = StateSnapshotBuilder::new()?;
let response = FleetStateOps::apply_command(cmd);
let reconciliation_error = if reconcile_funding {
CycleWorkflow::start().err().map(Into::into)
} else {
None
};
let snapshot = builder.with_fleet_state().build();
let propagation =
StateCascadeWorkflow::root_cascade_state_to(&snapshot, root_children).await?;
Ok(StateCascadeReportOps::command_response(
response,
propagation,
reconciliation_error,
))
}
}