From 75e7f9d731601f94b0a6474698fcd0412816c391 Mon Sep 17 00:00:00 2001 From: Jason Date: Sat, 29 Nov 2025 16:24:22 +0800 Subject: [PATCH] chore: remove dead code from MCP and provider modules - Remove unused `read_mcp_json` from gemini_mcp.rs - Remove unused `normalize_server_keys` from mcp/claude.rs - Remove unused `validate_mcp_entry` from mcp/validation.rs - Remove unused `write_codex_live`, `write_claude_live`, `app_not_found` from services/provider/mod.rs - Clean up unused imports --- src-tauri/src/gemini_mcp.rs | 10 --- src-tauri/src/mcp/claude.rs | 89 +------------------------- src-tauri/src/mcp/validation.rs | 43 ------------- src-tauri/src/services/provider/mod.rs | 40 ------------ 4 files changed, 1 insertion(+), 181 deletions(-) diff --git a/src-tauri/src/gemini_mcp.rs b/src-tauri/src/gemini_mcp.rs index 9374fc35e..c87a16c9c 100644 --- a/src-tauri/src/gemini_mcp.rs +++ b/src-tauri/src/gemini_mcp.rs @@ -38,16 +38,6 @@ fn write_json_value(path: &Path, value: &Value) -> Result<(), AppError> { atomic_write(path, json.as_bytes()) } -/// 读取 Gemini MCP 配置文件的完整 JSON 文本 -pub fn read_mcp_json() -> Result, AppError> { - let path = user_config_path(); - if !path.exists() { - return Ok(None); - } - let content = fs::read_to_string(&path).map_err(|e| AppError::io(&path, e))?; - Ok(Some(content)) -} - /// 读取 Gemini settings.json 中的 mcpServers 映射 /// /// 执行反向格式转换以保持与统一 MCP 结构的兼容性: diff --git a/src-tauri/src/mcp/claude.rs b/src-tauri/src/mcp/claude.rs index e187fdd83..5d1772726 100644 --- a/src-tauri/src/mcp/claude.rs +++ b/src-tauri/src/mcp/claude.rs @@ -1,6 +1,6 @@ //! Claude MCP 同步和导入模块 -use serde_json::{json, Value}; +use serde_json::Value; use std::collections::HashMap; use crate::app_config::{McpApps, McpConfig, McpServer, MultiAppConfig}; @@ -129,90 +129,3 @@ pub fn remove_server_from_claude(id: &str) -> Result<(), AppError> { // 写回 crate::claude_mcp::set_mcp_servers_map(¤t) } - -// ============================================================================ -// 旧版分应用 API(v3.7.0: 保留用于未来可能的迁移) -// ============================================================================ - -#[allow(dead_code)] -fn normalize_server_keys(map: &mut HashMap) -> usize { - let mut change_count = 0usize; - let mut renames: Vec<(String, String)> = Vec::new(); - - for (key_ref, value) in map.iter_mut() { - let key = key_ref.clone(); - let Some(obj) = value.as_object_mut() else { - continue; - }; - - let id_value = obj.get("id").cloned(); - - let target_id: String; - - match id_value { - Some(id_val) => match id_val.as_str() { - Some(id_str) => { - let trimmed = id_str.trim(); - if trimmed.is_empty() { - obj.insert("id".into(), json!(key.clone())); - change_count += 1; - target_id = key.clone(); - } else { - if trimmed != id_str { - obj.insert("id".into(), json!(trimmed)); - change_count += 1; - } - target_id = trimmed.to_string(); - } - } - None => { - obj.insert("id".into(), json!(key.clone())); - change_count += 1; - target_id = key.clone(); - } - }, - None => { - obj.insert("id".into(), json!(key.clone())); - change_count += 1; - target_id = key.clone(); - } - } - - if target_id != key { - renames.push((key, target_id)); - } - } - - for (old_key, new_key) in renames { - if old_key == new_key { - continue; - } - if map.contains_key(&new_key) { - log::warn!("MCP 条目 '{old_key}' 的内部 id '{new_key}' 与现有键冲突,回退为原键"); - if let Some(value) = map.get_mut(&old_key) { - if let Some(obj) = value.as_object_mut() { - if obj - .get("id") - .and_then(|v| v.as_str()) - .map(|s| s != old_key) - .unwrap_or(true) - { - obj.insert("id".into(), json!(old_key.clone())); - change_count += 1; - } - } - } - continue; - } - if let Some(mut value) = map.remove(&old_key) { - if let Some(obj) = value.as_object_mut() { - obj.insert("id".into(), json!(new_key.clone())); - } - log::info!("MCP 条目键名已自动修复: '{old_key}' -> '{new_key}'"); - map.insert(new_key, value); - change_count += 1; - } - } - - change_count -} diff --git a/src-tauri/src/mcp/validation.rs b/src-tauri/src/mcp/validation.rs index 06e93c08f..2e8c10a79 100644 --- a/src-tauri/src/mcp/validation.rs +++ b/src-tauri/src/mcp/validation.rs @@ -50,49 +50,6 @@ pub fn validate_server_spec(spec: &Value) -> Result<(), AppError> { Ok(()) } -#[allow(dead_code)] // v3.7.0: 旧的验证逻辑,保留用于未来可能的迁移 -pub fn validate_mcp_entry(entry: &Value) -> Result<(), AppError> { - let obj = entry - .as_object() - .ok_or_else(|| AppError::McpValidation("MCP 服务器条目必须为 JSON 对象".into()))?; - - let server = obj - .get("server") - .ok_or_else(|| AppError::McpValidation("MCP 服务器条目缺少 server 字段".into()))?; - validate_server_spec(server)?; - - for key in ["name", "description", "homepage", "docs"] { - if let Some(val) = obj.get(key) { - if !val.is_string() { - return Err(AppError::McpValidation(format!( - "MCP 服务器 {key} 必须为字符串" - ))); - } - } - } - - if let Some(tags) = obj.get("tags") { - let arr = tags - .as_array() - .ok_or_else(|| AppError::McpValidation("MCP 服务器 tags 必须为字符串数组".into()))?; - if !arr.iter().all(|item| item.is_string()) { - return Err(AppError::McpValidation( - "MCP 服务器 tags 必须为字符串数组".into(), - )); - } - } - - if let Some(enabled) = obj.get("enabled") { - if !enabled.is_boolean() { - return Err(AppError::McpValidation( - "MCP 服务器 enabled 必须为布尔值".into(), - )); - } - } - - Ok(()) -} - /// 从 MCP 条目中提取服务器规范 pub fn extract_server_spec(entry: &Value) -> Result { let obj = entry diff --git a/src-tauri/src/services/provider/mod.rs b/src-tauri/src/services/provider/mod.rs index 8baa5afb2..add15629b 100644 --- a/src-tauri/src/services/provider/mod.rs +++ b/src-tauri/src/services/provider/mod.rs @@ -13,8 +13,6 @@ use serde::Deserialize; use serde_json::Value; use crate::app_config::AppType; -use crate::codex_config::write_codex_live_atomic; -use crate::config::{get_claude_settings_path, write_json_file}; use crate::error::AppError; use crate::provider::{Provider, UsageResult}; use crate::services::mcp::McpService; @@ -329,36 +327,6 @@ impl ProviderService { .await } - #[allow(dead_code)] - fn write_codex_live(provider: &Provider) -> Result<(), AppError> { - let settings = provider - .settings_config - .as_object() - .ok_or_else(|| AppError::Config("Codex 配置必须是 JSON 对象".into()))?; - let auth = settings - .get("auth") - .ok_or_else(|| AppError::Config(format!("供应商 {} 缺少 auth 配置", provider.id)))?; - if !auth.is_object() { - return Err(AppError::Config(format!( - "供应商 {} 的 auth 必须是对象", - provider.id - ))); - } - let cfg_text = settings.get("config").and_then(Value::as_str); - - write_codex_live_atomic(auth, cfg_text)?; - Ok(()) - } - - #[allow(dead_code)] - fn write_claude_live(provider: &Provider) -> Result<(), AppError> { - let settings_path = get_claude_settings_path(); - let mut content = provider.settings_config.clone(); - let _ = normalize_claude_models_in_value(&mut content); - write_json_file(&settings_path, &content)?; - Ok(()) - } - pub(crate) fn write_gemini_live(provider: &Provider) -> Result<(), AppError> { write_gemini_live(provider) } @@ -558,14 +526,6 @@ impl ProviderService { } } - #[allow(dead_code)] - fn app_not_found(app_type: &AppType) -> AppError { - AppError::localized( - "provider.app_not_found", - format!("应用类型不存在: {app_type:?}"), - format!("App type not found: {app_type:?}"), - ) - } } /// Normalize Claude model keys in a JSON value