use serde::Deserialize;
use serde_json::Value;
use sqry_daemon_protocol::{ResponseEnvelope, ResponseMeta, WorkspaceId, WorkspaceIndexStatus};
use crate::error::DaemonError;
use super::{HandlerContext, MethodError};
#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct WorkspaceStatusParams {
pub workspace_id: WorkspaceId,
}
pub(crate) async fn handle(ctx: &HandlerContext, params: Value) -> Result<Value, MethodError> {
let params: WorkspaceStatusParams =
serde_json::from_value(params).map_err(MethodError::InvalidParams)?;
let aggregate = ctx
.manager
.workspace_index_status(¶ms.workspace_id)
.ok_or_else(|| {
MethodError::Daemon(DaemonError::WorkspaceNotLoaded {
root: std::path::PathBuf::from(format!(
"<workspace_id={}>",
params.workspace_id.as_short_hex()
)),
})
})?;
let envelope: ResponseEnvelope<WorkspaceIndexStatus> = ResponseEnvelope {
result: aggregate,
meta: ResponseMeta::management(ctx.daemon_version),
};
serde_json::to_value(&envelope).map_err(|e| {
MethodError::Internal(anyhow::anyhow!("serialise daemon/workspaceStatus: {e}"))
})
}