diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 8be890d..fb896e3 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,7 +1,5 @@ -use serde::{Deserialize, Serialize}; use serde_json::Value; -use std::fs::File; -use std::io::{BufRead, BufReader, Write}; +use std::io::Write; use std::path::{Path, PathBuf}; use std::process::{Command as ProcessCommand, Stdio}; use tauri::{ @@ -14,114 +12,6 @@ fn repo_root() -> PathBuf { manifest_dir.parent().unwrap_or(&manifest_dir).to_path_buf() } -fn sessions_file() -> PathBuf { - repo_root().join(".idea-hole").join("sessions.jsonl") -} - -#[derive(Deserialize)] -struct SessionFields { - title: Option, - description: Option, - saved_at: Option, -} - -#[derive(Serialize)] -struct SessionSummary { - title: String, - description: String, - saved_at: i64, -} - -fn open_sessions_file() -> Result, String> { - match File::open(sessions_file()) { - Ok(file) => Ok(Some(file)), - Err(err) if err.kind() == std::io::ErrorKind::NotFound => Ok(None), - Err(err) => Err(format!("Failed to open sessions file: {err}")), - } -} - -fn session_summary_from_line(line: &str) -> Option { - let fields: SessionFields = serde_json::from_str(line).ok()?; - let title = json_value_to_string(fields.title).trim().to_string(); - if title.is_empty() { - return None; - } - - Some(SessionSummary { - title, - description: json_value_to_string(fields.description), - saved_at: json_value_to_i64(fields.saved_at), - }) -} - -fn json_value_to_string(value: Option) -> String { - match value { - Some(Value::String(text)) => text, - Some(Value::Number(number)) => number.to_string(), - Some(Value::Bool(value)) => value.to_string(), - _ => String::new(), - } -} - -fn json_value_to_i64(value: Option) -> i64 { - match value { - Some(Value::Number(number)) => number - .as_i64() - .or_else(|| number.as_u64().and_then(|value| i64::try_from(value).ok())) - .or_else(|| number.as_f64().map(|value| value as i64)) - .unwrap_or_default(), - Some(Value::String(text)) => text.parse::().unwrap_or_default(), - _ => 0, - } -} - -fn list_sessions_fast() -> Result, String> { - let Some(file) = open_sessions_file()? else { - return Ok(Vec::new()); - }; - - let mut sessions = Vec::new(); - for line in BufReader::new(file).lines() { - let line = line.map_err(|err| format!("Failed to read sessions file: {err}"))?; - if line.trim().is_empty() { - continue; - } - if let Some(summary) = session_summary_from_line(&line) { - sessions.push(summary); - } - } - - Ok(sessions) -} - -fn load_session_fast(title: &str) -> Result { - let target = title.trim(); - if target.is_empty() { - return Ok(Value::Null); - } - - let Some(file) = open_sessions_file()? else { - return Ok(Value::Null); - }; - - for line in BufReader::new(file).lines() { - let line = line.map_err(|err| format!("Failed to read sessions file: {err}"))?; - if line.trim().is_empty() { - continue; - } - - let Some(summary) = session_summary_from_line(&line) else { - continue; - }; - if summary.title == target { - return serde_json::from_str(&line) - .map_err(|err| format!("Failed to parse saved session: {err}")); - } - } - - Ok(Value::Null) -} - enum Backend { Sidecar(PathBuf), Source { python: String, script: PathBuf },