use crate::client_objectiveai_mcp::{server_request, server_response};
use std::future::Future;
pub trait McpHandler: Send + Sync + 'static {
fn handle(
&self,
request: server_request::Request,
) -> impl Future<Output = server_response::Response> + Send;
}
#[derive(Debug, Clone, Copy, Default)]
pub struct RejectHandler;
const REJECT_CODE: i64 = -32601;
const REJECT_MESSAGE: &str = "this client does not host objectiveai-mcp";
fn reject_err<R>() -> server_response::JsonRpcResult<R> {
server_response::JsonRpcResult::Err {
code: REJECT_CODE,
message: REJECT_MESSAGE.into(),
data: None,
}
}
impl McpHandler for RejectHandler {
async fn handle(
&self,
request: server_request::Request,
) -> server_response::Response {
use server_response::Payload;
let payload = match request.payload {
server_request::Payload::Initialize { mcp_kind, .. } => {
Payload::Initialize { mcp_kind, result: reject_err() }
}
server_request::Payload::ToolsList { mcp_kind, .. } => {
Payload::ToolsList { mcp_kind, result: reject_err() }
}
server_request::Payload::ToolsCall { mcp_kind, .. } => {
Payload::ToolsCall { mcp_kind, result: reject_err() }
}
server_request::Payload::ResourcesList { mcp_kind, .. } => {
Payload::ResourcesList { mcp_kind, result: reject_err() }
}
server_request::Payload::ResourcesRead { mcp_kind, .. } => {
Payload::ResourcesRead { mcp_kind, result: reject_err() }
}
server_request::Payload::SessionTerminate { mcp_kind } => {
Payload::SessionTerminate { mcp_kind, result: reject_err() }
}
server_request::Payload::ReadMessageQueue(_) => {
Payload::ReadMessageQueue(reject_err())
}
server_request::Payload::Retrieve(_) => {
Payload::Retrieve(reject_err())
}
};
server_response::Response {
id: request.id,
payload,
}
}
}