rnacos 0.8.3

Nacos server re-implemented in Rust.
Documentation
use crate::common::appdata::AppShareData;
use crate::common::model::{ApiResult, PageResult};
use crate::mcp::model::actor_model::{McpManagerReq, McpManagerResult};
use crate::openapi::mcp_api::model::{
    OpenMcpServerDto, OpenMcpServerQueryParam, OpenToolFunctionValue, OpenToolSpecQueryParam,
};
use actix_web::{web, HttpRequest, HttpResponse, Responder};
use std::sync::Arc;

pub async fn query_mcp_server_list(
    _req: HttpRequest,
    query: web::Query<OpenMcpServerQueryParam>,
    appdata: web::Data<Arc<AppShareData>>,
) -> impl Responder {
    let param = query.into_inner();

    if let Err(err) = param.validate() {
        return HttpResponse::BadRequest().json(ApiResult::<String>::error(
            "INVALID_PARAM".to_string(),
            Some(format!("Parameter validation failed: {}", err)),
        ));
    }

    let mcp_query_param = param.to_mcp_query_param();
    let cmd = McpManagerReq::QueryServer(mcp_query_param);

    match appdata.mcp_manager.send(cmd).await {
        Ok(Ok(McpManagerResult::ServerPageInfo(total_count, list))) => {
            let open_dto_list: Vec<OpenMcpServerDto> =
                list.iter().map(OpenMcpServerDto::from_server_dto).collect();
            HttpResponse::Ok().json(ApiResult::success(Some(PageResult {
                total_count,
                list: open_dto_list,
            })))
        }
        Ok(Ok(_)) => HttpResponse::InternalServerError().json(ApiResult::<String>::error(
            "UNEXPECTED_RESPONSE".to_string(),
            Some("Unexpected response from MCP Manager".to_string()),
        )),
        Ok(Err(err)) => HttpResponse::InternalServerError().json(ApiResult::<String>::error(
            "MCP_MANAGER_ERROR".to_string(),
            Some(format!("MCP Manager error: {}", err)),
        )),
        Err(err) => HttpResponse::InternalServerError().json(ApiResult::<String>::error(
            "SYSTEM_ERROR".to_string(),
            Some(format!("Unable to connect to MCP Manager: {}", err)),
        )),
    }
}

pub async fn query_tool_spec_list(
    _req: HttpRequest,
    query: web::Query<OpenToolSpecQueryParam>,
    appdata: web::Data<Arc<AppShareData>>,
) -> impl Responder {
    let param = query.into_inner();

    if let Err(err) = param.validate() {
        return HttpResponse::BadRequest().json(ApiResult::<String>::error(
            "INVALID_PARAM".to_string(),
            Some(format!("Parameter validation failed: {}", err)),
        ));
    }

    let tool_spec_query_param = param.to_tool_spec_query_param();
    let cmd = McpManagerReq::QueryToolSpec(tool_spec_query_param);

    match appdata.mcp_manager.send(cmd).await {
        Ok(Ok(McpManagerResult::ToolSpecPageInfo(total_count, list))) => {
            let tool_list: Vec<OpenToolFunctionValue> = list
                .iter()
                .map(|dto| {
                    OpenToolFunctionValue::new(
                        dto.namespace.clone(),
                        dto.group.clone(),
                        dto.function.as_ref().clone(),
                    )
                })
                .collect();
            HttpResponse::Ok().json(ApiResult::success(Some(PageResult {
                total_count,
                list: tool_list,
            })))
        }
        Ok(Ok(_)) => HttpResponse::InternalServerError().json(ApiResult::<String>::error(
            "UNEXPECTED_RESPONSE".to_string(),
            Some("Unexpected response from MCP Manager".to_string()),
        )),
        Ok(Err(err)) => HttpResponse::InternalServerError().json(ApiResult::<String>::error(
            "MCP_MANAGER_ERROR".to_string(),
            Some(format!("MCP Manager error: {}", err)),
        )),
        Err(err) => HttpResponse::InternalServerError().json(ApiResult::<String>::error(
            "SYSTEM_ERROR".to_string(),
            Some(format!("Unable to connect to MCP Manager: {}", err)),
        )),
    }
}