From 764b4d742007f78b6f0849b3f381e716466fcd30 Mon Sep 17 00:00:00 2001 From: imeepos Date: Mon, 21 Jul 2025 15:29:31 +0800 Subject: [PATCH] fix: build error --- .../src/infrastructure/gemini_service.rs | 218 +----------------- 1 file changed, 2 insertions(+), 216 deletions(-) diff --git a/apps/desktop/src-tauri/src/infrastructure/gemini_service.rs b/apps/desktop/src-tauri/src/infrastructure/gemini_service.rs index d56cde0..4278783 100644 --- a/apps/desktop/src-tauri/src/infrastructure/gemini_service.rs +++ b/apps/desktop/src-tauri/src/infrastructure/gemini_service.rs @@ -820,223 +820,9 @@ impl GeminiService { println!("❌ TolerantJsonParser解析失败: {}", e); println!("📝 响应内容预览: {}", &response[..response.len().min(200)]); - // 如果TolerantJsonParser也失败了,尝试回退到原有的修复方案 - println!("⚠️ 回退到传统修复方案"); - match self.fallback_json_extraction(response) { - Ok(result) => { - println!("✅ 传统修复方案成功"); - Ok(result) - } - Err(fallback_error) => { - println!("❌ 传统修复方案也失败: {}", fallback_error); - Err(anyhow!("所有JSON解析方案都失败了。TolerantJsonParser错误: {}; 传统方案错误: {}", e, fallback_error)) - } - } + // 直接返回错误,不使用回退方案,便于调试和问题定位 + Err(anyhow!("TolerantJsonParser解析失败: {}. 响应内容: {}", e, &response[..response.len().min(500)])) } } } - - /// 回退的JSON提取方案(保留原有逻辑作为备用) - fn fallback_json_extraction(&self, response: &str) -> Result { - println!("🔍 使用传统方法提取JSON"); - - // 尝试直接解析为JSON - if let Ok(_) = serde_json::from_str::(response) { - println!("✅ 直接解析JSON成功"); - return Ok(response.to_string()); - } - - // 查找JSON代码块 ```json ... ``` - if let Some(start) = response.find("```json") { - println!("🔍 找到```json标记,位置: {}", start); - let json_start = start + 7; // "```json".len() - - // 从json_start位置开始查找结束的``` - if let Some(end_offset) = response[json_start..].find("```") { - let json_end = json_start + end_offset; - let json_content = response[json_start..json_end].trim(); - - println!("🔍 提取的JSON内容长度: {}", json_content.len()); - println!("🔍 JSON内容预览: {}", &json_content[..json_content.len().min(100)]); - - // 验证提取的JSON - match serde_json::from_str::(json_content) { - Ok(_) => { - println!("✅ 从代码块提取JSON成功"); - return Ok(json_content.to_string()); - } - Err(e) => { - println!("❌ JSON解析失败: {}", e); - } - } - } else { - println!("⚠️ 未找到结束的```标记,尝试修复截断的JSON"); - // 尝试修复截断的JSON - let json_content = response[json_start..].trim(); - if let Ok(fixed_json) = self.legacy_fix_truncated_json(json_content) { - println!("✅ 修复截断JSON成功"); - return Ok(fixed_json); - } - } - } - - // 查找普通的JSON对象 { ... } - if let Some(start) = response.find('{') { - println!("🔍 找到JSON对象开始位置: {}", start); - - // 使用更智能的方法找到匹配的结束括号 - let mut brace_count = 0; - let mut end_pos = None; - - for (i, ch) in response[start..].char_indices() { - match ch { - '{' => brace_count += 1, - '}' => { - brace_count -= 1; - if brace_count == 0 { - end_pos = Some(start + i); - break; - } - } - _ => {} - } - } - - if let Some(end) = end_pos { - let json_content = &response[start..=end]; - println!("🔍 提取的JSON对象长度: {}", json_content.len()); - - // 验证提取的JSON - match serde_json::from_str::(json_content) { - Ok(_) => { - println!("✅ 从对象提取JSON成功"); - return Ok(json_content.to_string()); - } - Err(e) => { - println!("❌ JSON对象解析失败: {}", e); - } - } - } else { - println!("⚠️ 未找到匹配的结束括号"); - } - } - - // 如果无法提取有效JSON,尝试最后的修复方案 - println!("⚠️ 无法从响应中提取有效JSON,尝试最后的修复方案"); - - // 尝试从整个响应中修复JSON - if let Ok(fixed_json) = self.legacy_fix_truncated_json(response) { - println!("✅ 最后修复方案成功"); - return Ok(fixed_json); - } - - // 如果所有方法都失败了,返回错误 - Err(anyhow!("无法从Gemini响应中提取有效的JSON数据。响应内容: {}", - response.chars().take(500).collect::())) - } - - /// 传统的截断JSON修复方法(保留作为备用) - fn legacy_fix_truncated_json(&self, json_str: &str) -> Result { - println!("🔧 尝试修复截断的JSON"); - - // 尝试解析部分JSON并提取有用信息 - let mut fixed_json = serde_json::json!({ - "environment_tags": ["Unknown"], - "environment_color_pattern": { - "hue": 0.0, - "saturation": 0.0, - "value": 0.5 - }, - "dress_color_pattern": { - "hue": 0.0, - "saturation": 0.0, - "value": 0.5 - }, - "style_description": "", - "products": [] - }); - - // 尝试提取环境标签 - if let Some(env_start) = json_str.find("\"environment_tags\"") { - if let Some(array_start) = json_str[env_start..].find('[') { - let start_pos = env_start + array_start; - if let Some(array_end) = json_str[start_pos..].find(']') { - let end_pos = start_pos + array_end + 1; - let env_array_str = &json_str[start_pos..end_pos]; - if let Ok(env_tags) = serde_json::from_str::>(env_array_str) { - fixed_json["environment_tags"] = serde_json::json!(env_tags); - println!("✅ 提取环境标签成功: {:?}", env_tags); - } - } - } - } - - // 尝试提取风格描述 - if let Some(desc_start) = json_str.find("\"style_description\"") { - if let Some(quote_start) = json_str[desc_start..].find('"') { - let start_pos = desc_start + quote_start + 1; - // 查找下一个未转义的引号 - let mut end_pos = None; - let mut chars = json_str[start_pos..].char_indices(); - while let Some((i, ch)) = chars.next() { - if ch == '"' { - // 检查是否是转义的引号 - let prev_char = if i > 0 { - json_str[start_pos..].chars().nth(i - 1) - } else { - None - }; - if prev_char != Some('\\') { - end_pos = Some(start_pos + i); - break; - } - } - } - - if let Some(end) = end_pos { - let description = &json_str[start_pos..end]; - fixed_json["style_description"] = serde_json::json!(description); - println!("✅ 提取风格描述成功"); - } - } - } - - // 尝试提取颜色信息 - for (color_key, json_key) in [ - ("environment_color_pattern", "environment_color_pattern"), - ("dress_color_pattern", "dress_color_pattern") - ] { - if let Some(color_start) = json_str.find(&format!("\"{}\"", color_key)) { - if let Some(obj_start) = json_str[color_start..].find('{') { - let start_pos = color_start + obj_start; - let mut brace_count = 0; - let mut end_pos = None; - - for (i, ch) in json_str[start_pos..].char_indices() { - match ch { - '{' => brace_count += 1, - '}' => { - brace_count -= 1; - if brace_count == 0 { - end_pos = Some(start_pos + i + 1); - break; - } - } - _ => {} - } - } - - if let Some(end) = end_pos { - let color_obj_str = &json_str[start_pos..end]; - if let Ok(color_obj) = serde_json::from_str::(color_obj_str) { - fixed_json[json_key] = color_obj; - println!("✅ 提取{}成功", color_key); - } - } - } - } - } - - Ok(fixed_json.to_string()) - } }