mcp_stdio_proxy/server/handlers/
run_code_handler.rs1use std::collections::HashMap;
2
3use axum::{Json, response::IntoResponse};
4use http::StatusCode;
5use log::{debug, error, info};
6use run_code_rmcp::{CodeExecutor, LanguageScript, RunCodeHttpResult};
7use serde::{Deserialize, Serialize};
8use serde_json::Value;
9
10use crate::AppError;
11
12#[derive(Debug, Clone, Serialize, Deserialize)]
14pub struct RunCodeMessageRequest {
15 pub json_param: HashMap<String, Value>,
17 pub code: String,
19 pub uid: String,
21 pub engine_type: String,
22}
23
24impl RunCodeMessageRequest {
25 pub fn get_language_script(&self) -> LanguageScript {
27 match self.engine_type.as_str() {
28 "js" => LanguageScript::Js,
29 "ts" => LanguageScript::Ts,
30 "python" => LanguageScript::Python,
31 _ => LanguageScript::Js,
32 }
33 }
34}
35
36pub async fn run_code_handler(
39 Json(run_code_message_request): Json<RunCodeMessageRequest>,
40) -> Result<impl IntoResponse, AppError> {
41 let params = match serde_json::to_value(run_code_message_request.json_param.clone()) {
43 Ok(v) => v,
44 Err(e) => {
45 error!("run_code_handler参数序列化失败: {e:?}");
46 return Err(AppError::from(e));
47 }
48 };
49
50 let code = run_code_message_request.code.clone();
52 let language = run_code_message_request.get_language_script();
53
54 debug!("run_code_handler language:{language:?}");
55 debug!("run_code_handler code:{code:?}");
56 debug!("run_code_handler params:{params:?}");
57 let result = match CodeExecutor::execute_with_params(&code, language, Some(params), None).await
58 {
59 Ok(result) => result,
60 Err(e) => {
61 error!("run_code_handler执行失败: {e:?}");
62 return Err(AppError::from(e));
63 }
64 };
65
66 if !result.success {
67 let error_message = result
68 .error
69 .as_deref()
70 .unwrap_or("run_code_handler执行失败但未提供错误信息");
71 error!("run_code_handler执行返回失败: {error_message}");
72 }
73
74 let data = match serde_json::to_value(&result) {
75 Ok(data) => data,
76 Err(e) => {
77 error!("run_code_handler序列化结果失败: {e:?}");
78 return Err(AppError::from(e));
79 }
80 };
81 info!("run_code_handler result:{:?}", &result.success);
83 debug!("run_code_handler result:{:?}", &data);
84 let run_code_http_result = RunCodeHttpResult {
86 data,
87 success: result.success,
88 error: result.error.clone(),
89 };
90 let body = serde_json::to_string(&run_code_http_result)?;
91 Ok((StatusCode::OK, body).into_response())
92}