use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::path::PathBuf;
use super::super::path_policy::resolve_index_root;
use super::super::protocol::{ResponseEnvelope, ResponseMeta};
use super::{HandlerContext, MethodError};
use crate::error::DaemonError;
#[derive(Debug, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ResetParams {
pub path: PathBuf,
#[serde(default)]
pub force: bool,
}
#[derive(Debug, Clone, Serialize)]
pub struct ResetResult {
pub root: PathBuf,
pub reset: bool,
}
pub(crate) async fn handle(ctx: &HandlerContext, params: Value) -> Result<Value, MethodError> {
let p: ResetParams = serde_json::from_value(params).map_err(MethodError::InvalidParams)?;
let canonical = resolve_index_root(&p.path).map_err(|e| {
MethodError::Daemon(DaemonError::InvalidArgument {
reason: format!("cannot resolve path {}: {e}", p.path.display()),
})
})?;
let Some((key, _ws)) = ctx.manager.find_key_and_workspace_by_path(&canonical) else {
return Err(MethodError::Daemon(DaemonError::WorkspaceNotLoaded {
root: canonical,
}));
};
let reset = ctx
.manager
.reset(&key, p.force)
.map_err(MethodError::Daemon)?;
let envelope = ResponseEnvelope {
result: ResetResult {
root: canonical,
reset,
},
meta: ResponseMeta::management(ctx.daemon_version),
};
serde_json::to_value(&envelope)
.map_err(|e| MethodError::Internal(anyhow::anyhow!("serialise daemon/reset: {e}")))
}