use bevy_brp_mcp_macros::ParamStruct;
use bevy_brp_mcp_macros::ResultStruct;
use bevy_brp_mcp_macros::ToolFn;
use schemars::JsonSchema;
use serde::Deserialize;
use serde::Serialize;
use super::manager::WATCH_MANAGER;
use crate::error::Error;
use crate::error::Result;
use crate::tool::HandlerContext;
use crate::tool::HandlerResult;
use crate::tool::ToolFn;
use crate::tool::ToolResult;
#[derive(Clone, Deserialize, Serialize, JsonSchema, ParamStruct)]
pub struct StopWatchParams {
pub watch_id: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize, ResultStruct)]
pub struct StopWatchResult {
#[to_metadata]
watch_id: u32,
#[to_message(message_template = "Stopped watch {watch_id}")]
message_template: String,
}
#[derive(ToolFn)]
#[tool_fn(params = "StopWatchParams", output = "StopWatchResult")]
pub struct BrpStopWatch;
async fn handle_impl(params: StopWatchParams) -> Result<StopWatchResult> {
let result = {
let mut manager = WATCH_MANAGER.lock().await;
manager.stop_watch(params.watch_id)
};
result
.map(|()| StopWatchResult::new(params.watch_id))
.map_err(|error| {
Error::tool_call_failed(format!("Failed to stop watch {}: {error}", params.watch_id))
.into()
})
}