use crate::context::CliContext;
use crate::error::CliError;
use crate::operator::{
render_json_sorted, resolve_socket, send_request, validate_posture_patch, PosturePatchEntry,
WireRequest, WireResponse,
};
use crate::prompt::PromptPlan;
use crate::report::FleetReport;
#[derive(Debug, Clone, PartialEq)]
pub enum FleetCommand {
PostureShow {
socket: Option<String>,
},
PostureSet {
socket: Option<String>,
patch: Vec<PosturePatchEntry>,
},
}
impl FleetCommand {
#[must_use]
pub const fn prompt_plan(&self, _ctx: &CliContext<'_>) -> PromptPlan {
PromptPlan::None
}
}
pub(crate) fn execute(
command: &FleetCommand,
ctx: &CliContext<'_>,
) -> Result<FleetReport, CliError> {
match command {
FleetCommand::PostureShow { socket } => Ok(FleetReport::Posture {
effective: call(ctx, socket.as_deref(), &WireRequest::GetFleetPosture)?,
}),
FleetCommand::PostureSet { socket, patch } => {
validate_posture_patch(patch)?;
let request = WireRequest::SetFleetPosture {
patch: patch.clone(),
};
Ok(FleetReport::Posture {
effective: call(ctx, socket.as_deref(), &request)?,
})
}
}
}
fn call(
ctx: &CliContext<'_>,
socket: Option<&str>,
request: &WireRequest,
) -> Result<String, CliError> {
let socket = resolve_socket(ctx.env(), socket);
match send_request(&socket, request)? {
WireResponse::Ok { effective, .. } => Ok(render_json_sorted(effective.as_ref())),
WireResponse::Err { error } => Err(CliError::OperatorRefused(error)),
}
}