chore: format code and clean up unused props
- Run cargo fmt on Rust backend code - Format TypeScript imports and code style - Remove unused appId prop from ProviderPresetSelector - Clean up unused variables in tests - Integrate notes field handling in provider dialogs
This commit is contained in:
@@ -317,7 +317,9 @@ impl MultiAppConfig {
|
||||
|
||||
// 迁移通用配置片段:claude_common_config_snippet → common_config_snippets.claude
|
||||
if let Some(old_claude_snippet) = config.claude_common_config_snippet.take() {
|
||||
log::info!("迁移通用配置:claude_common_config_snippet → common_config_snippets.claude");
|
||||
log::info!(
|
||||
"迁移通用配置:claude_common_config_snippet → common_config_snippets.claude"
|
||||
);
|
||||
config.common_config_snippets.claude = Some(old_claude_snippet);
|
||||
updated = true;
|
||||
}
|
||||
@@ -414,9 +416,7 @@ impl MultiAppConfig {
|
||||
return Ok(false);
|
||||
}
|
||||
|
||||
log::info!(
|
||||
"检测到已存在配置文件且 Prompt 列表为空,将尝试从现有提示词文件自动导入"
|
||||
);
|
||||
log::info!("检测到已存在配置文件且 Prompt 列表为空,将尝试从现有提示词文件自动导入");
|
||||
|
||||
let mut imported = false;
|
||||
for app in [AppType::Claude, AppType::Codex, AppType::Gemini] {
|
||||
|
||||
@@ -139,13 +139,11 @@ pub fn upsert_mcp_server(id: &str, spec: Value) -> Result<bool, AppError> {
|
||||
if is_http || is_sse {
|
||||
let url = spec.get("url").and_then(|x| x.as_str()).unwrap_or("");
|
||||
if url.is_empty() {
|
||||
return Err(AppError::McpValidation(
|
||||
if is_http {
|
||||
"http 类型的 MCP 服务器缺少 url 字段".into()
|
||||
} else {
|
||||
"sse 类型的 MCP 服务器缺少 url 字段".into()
|
||||
},
|
||||
));
|
||||
return Err(AppError::McpValidation(if is_http {
|
||||
"http 类型的 MCP 服务器缺少 url 字段".into()
|
||||
} else {
|
||||
"sse 类型的 MCP 服务器缺少 url 字段".into()
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -184,13 +184,12 @@ pub async fn get_common_config_snippet(
|
||||
use crate::app_config::AppType;
|
||||
use std::str::FromStr;
|
||||
|
||||
let app = AppType::from_str(&app_type)
|
||||
.map_err(|e| format!("无效的应用类型: {}", e))?;
|
||||
let app = AppType::from_str(&app_type).map_err(|e| format!("无效的应用类型: {e}"))?;
|
||||
|
||||
let guard = state
|
||||
.config
|
||||
.read()
|
||||
.map_err(|e| format!("读取配置锁失败: {}", e))?;
|
||||
.map_err(|e| format!("读取配置锁失败: {e}"))?;
|
||||
|
||||
Ok(guard.common_config_snippets.get(&app).cloned())
|
||||
}
|
||||
@@ -205,13 +204,12 @@ pub async fn set_common_config_snippet(
|
||||
use crate::app_config::AppType;
|
||||
use std::str::FromStr;
|
||||
|
||||
let app = AppType::from_str(&app_type)
|
||||
.map_err(|e| format!("无效的应用类型: {}", e))?;
|
||||
let app = AppType::from_str(&app_type).map_err(|e| format!("无效的应用类型: {e}"))?;
|
||||
|
||||
let mut guard = state
|
||||
.config
|
||||
.write()
|
||||
.map_err(|e| format!("写入配置锁失败: {}", e))?;
|
||||
.map_err(|e| format!("写入配置锁失败: {e}"))?;
|
||||
|
||||
// 验证格式(根据应用类型)
|
||||
if !snippet.trim().is_empty() {
|
||||
@@ -219,7 +217,7 @@ pub async fn set_common_config_snippet(
|
||||
AppType::Claude | AppType::Gemini => {
|
||||
// 验证 JSON 格式
|
||||
serde_json::from_str::<serde_json::Value>(&snippet)
|
||||
.map_err(|e| format!("无效的 JSON 格式: {}", e))?;
|
||||
.map_err(|e| format!("无效的 JSON 格式: {e}"))?;
|
||||
}
|
||||
AppType::Codex => {
|
||||
// TOML 格式暂不验证(或可使用 toml crate)
|
||||
|
||||
@@ -48,8 +48,6 @@ pub fn read_mcp_json() -> Result<Option<String>, AppError> {
|
||||
Ok(Some(content))
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// 读取 Gemini settings.json 中的 mcpServers 映射
|
||||
pub fn read_mcp_servers_map() -> Result<std::collections::HashMap<String, Value>, AppError> {
|
||||
let path = user_config_path();
|
||||
|
||||
@@ -396,11 +396,7 @@ pub fn import_from_claude(config: &mut MultiAppConfig) -> Result<usize, AppError
|
||||
}
|
||||
|
||||
if !errors.is_empty() {
|
||||
log::warn!(
|
||||
"导入完成,但有 {} 项失败: {:?}",
|
||||
errors.len(),
|
||||
errors
|
||||
);
|
||||
log::warn!("导入完成,但有 {} 项失败: {:?}", errors.len(), errors);
|
||||
}
|
||||
|
||||
Ok(changed)
|
||||
@@ -783,11 +779,7 @@ pub fn import_from_gemini(config: &mut MultiAppConfig) -> Result<usize, AppError
|
||||
}
|
||||
|
||||
if !errors.is_empty() {
|
||||
log::warn!(
|
||||
"导入完成,但有 {} 项失败: {:?}",
|
||||
errors.len(),
|
||||
errors
|
||||
);
|
||||
log::warn!("导入完成,但有 {} 项失败: {:?}", errors.len(), errors);
|
||||
}
|
||||
|
||||
Ok(changed)
|
||||
|
||||
@@ -488,10 +488,17 @@ url = "https://example.com"
|
||||
assert!(changed >= 2, "should import both servers");
|
||||
|
||||
// v3.7.0: 检查统一结构
|
||||
let servers = config.mcp.servers.as_ref().expect("unified servers should exist");
|
||||
let servers = config
|
||||
.mcp
|
||||
.servers
|
||||
.as_ref()
|
||||
.expect("unified servers should exist");
|
||||
|
||||
let echo = servers.get("echo_server").expect("echo server");
|
||||
assert_eq!(echo.apps.codex, true, "Codex app should be enabled for echo_server");
|
||||
assert_eq!(
|
||||
echo.apps.codex, true,
|
||||
"Codex app should be enabled for echo_server"
|
||||
);
|
||||
let server_spec = echo.server.as_object().expect("server spec");
|
||||
assert_eq!(
|
||||
server_spec
|
||||
@@ -502,7 +509,10 @@ url = "https://example.com"
|
||||
);
|
||||
|
||||
let http = servers.get("http_server").expect("http server");
|
||||
assert_eq!(http.apps.codex, true, "Codex app should be enabled for http_server");
|
||||
assert_eq!(
|
||||
http.apps.codex, true,
|
||||
"Codex app should be enabled for http_server"
|
||||
);
|
||||
let http_spec = http.server.as_object().expect("http spec");
|
||||
assert_eq!(
|
||||
http_spec.get("url").and_then(|v| v.as_str()).unwrap_or(""),
|
||||
@@ -541,7 +551,7 @@ command = "echo"
|
||||
}),
|
||||
apps: cc_switch_lib::McpApps {
|
||||
claude: false,
|
||||
codex: false, // 初始未启用
|
||||
codex: false, // 初始未启用
|
||||
gemini: false,
|
||||
},
|
||||
description: None,
|
||||
@@ -564,7 +574,10 @@ command = "echo"
|
||||
.expect("existing entry");
|
||||
|
||||
// 验证 Codex 应用已启用
|
||||
assert_eq!(entry.apps.codex, true, "Codex app should be enabled after import");
|
||||
assert_eq!(
|
||||
entry.apps.codex, true,
|
||||
"Codex app should be enabled after import"
|
||||
);
|
||||
|
||||
// 验证现有配置被保留(server 不应被覆盖)
|
||||
let spec = entry.server.as_object().expect("server spec");
|
||||
@@ -662,7 +675,7 @@ fn import_from_claude_merges_into_config() {
|
||||
"command": "prev"
|
||||
}),
|
||||
apps: cc_switch_lib::McpApps {
|
||||
claude: false, // 初始未启用
|
||||
claude: false, // 初始未启用
|
||||
codex: false,
|
||||
gemini: false,
|
||||
},
|
||||
@@ -686,7 +699,10 @@ fn import_from_claude_merges_into_config() {
|
||||
.expect("entry exists");
|
||||
|
||||
// 验证 Claude 应用已启用
|
||||
assert_eq!(entry.apps.claude, true, "Claude app should be enabled after import");
|
||||
assert_eq!(
|
||||
entry.apps.claude, true,
|
||||
"Claude app should be enabled after import"
|
||||
);
|
||||
|
||||
// 验证现有配置被保留(server 不应被覆盖)
|
||||
let server = entry.server.as_object().expect("server obj");
|
||||
|
||||
@@ -127,8 +127,14 @@ fn import_mcp_from_claude_creates_config_and_enables_servers() {
|
||||
|
||||
let guard = state.config.read().expect("lock config");
|
||||
// v3.7.0: 检查统一结构
|
||||
let servers = guard.mcp.servers.as_ref().expect("unified servers should exist");
|
||||
let entry = servers.get("echo").expect("server imported into unified structure");
|
||||
let servers = guard
|
||||
.mcp
|
||||
.servers
|
||||
.as_ref()
|
||||
.expect("unified servers should exist");
|
||||
let entry = servers
|
||||
.get("echo")
|
||||
.expect("server imported into unified structure");
|
||||
assert!(
|
||||
entry.apps.claude,
|
||||
"imported server should have Claude app enabled"
|
||||
@@ -182,10 +188,12 @@ fn set_mcp_enabled_for_codex_writes_live_config() {
|
||||
// 创建 Codex 配置目录和文件
|
||||
let codex_dir = home.join(".codex");
|
||||
fs::create_dir_all(&codex_dir).expect("create codex dir");
|
||||
fs::write(codex_dir.join("auth.json"), r#"{"OPENAI_API_KEY":"test-key"}"#)
|
||||
.expect("create auth.json");
|
||||
fs::write(codex_dir.join("config.toml"), "")
|
||||
.expect("create empty config.toml");
|
||||
fs::write(
|
||||
codex_dir.join("auth.json"),
|
||||
r#"{"OPENAI_API_KEY":"test-key"}"#,
|
||||
)
|
||||
.expect("create auth.json");
|
||||
fs::write(codex_dir.join("config.toml"), "").expect("create empty config.toml");
|
||||
|
||||
let mut config = MultiAppConfig::default();
|
||||
config.ensure_app(&AppType::Codex);
|
||||
@@ -203,7 +211,7 @@ fn set_mcp_enabled_for_codex_writes_live_config() {
|
||||
}),
|
||||
apps: McpApps {
|
||||
claude: false,
|
||||
codex: false, // 初始未启用
|
||||
codex: false, // 初始未启用
|
||||
gemini: false,
|
||||
},
|
||||
description: None,
|
||||
|
||||
Reference in New Issue
Block a user