use axum::response::{IntoResponse, Response};
use http::StatusCode;
use serde::{Deserialize, Serialize};
use super::{McpProtocol, McpType};
#[derive(Deserialize, Debug, Clone)]
pub struct CheckMcpStatusRequestParams {
#[serde(rename = "mcpId")]
pub mcp_id: String,
#[serde(rename = "mcpJsonConfig")]
pub mcp_json_config: String,
#[serde(rename = "mcpType", default = "default_mcp_type")]
pub mcp_type: McpType,
#[serde(rename = "backendProtocol")]
#[allow(dead_code)] pub backend_protocol: Option<McpProtocol>,
}
fn default_mcp_type() -> McpType {
McpType::OneShot
}
#[derive(Deserialize, Debug, Serialize)]
pub struct CheckMcpStatusResponseParams {
pub ready: bool,
pub status: McpStatusResponseEnum,
pub message: Option<String>,
}
impl CheckMcpStatusResponseParams {
pub fn new(ready: bool, status: CheckMcpStatusResponseStatus, message: Option<String>) -> Self {
let mut message = message;
if let CheckMcpStatusResponseStatus::Error(err) = status.clone() {
message = Some(err.to_string());
}
let status = McpStatusResponseEnum::from(status);
Self {
ready,
status,
message,
}
}
}
#[derive(Deserialize, Debug, Serialize, Clone)]
pub enum McpStatusResponseEnum {
Ready,
Pending,
Error,
}
#[derive(Deserialize, Debug, Serialize, Clone, Default)]
pub enum CheckMcpStatusResponseStatus {
Ready,
#[default]
Pending,
Error(String),
}
impl From<CheckMcpStatusResponseStatus> for McpStatusResponseEnum {
fn from(value: CheckMcpStatusResponseStatus) -> Self {
match value {
CheckMcpStatusResponseStatus::Ready => Self::Ready,
CheckMcpStatusResponseStatus::Pending => Self::Pending,
CheckMcpStatusResponseStatus::Error(_) => Self::Error,
}
}
}
impl IntoResponse for CheckMcpStatusResponseParams {
fn into_response(self) -> Response {
if let Ok(body) = serde_json::to_string(&self) {
(StatusCode::OK, body).into_response()
} else {
(
StatusCode::INTERNAL_SERVER_ERROR,
"serde_json::to_string error".to_string(),
)
.into_response()
}
}
}