diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index c57bd5f..e5e4d24 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -20,9 +20,9 @@ fn sessions_file() -> PathBuf { #[derive(Deserialize)] struct SessionFields { - title: Option, - description: Option, - saved_at: Option, + title: Option, + description: Option, + saved_at: Option, } #[derive(Serialize)] @@ -42,18 +42,39 @@ fn open_sessions_file() -> Result, String> { fn session_summary_from_line(line: &str) -> Option { let fields: SessionFields = serde_json::from_str(line).ok()?; - let title = fields.title.unwrap_or_default().trim().to_string(); + let title = json_value_to_string(fields.title).trim().to_string(); if title.is_empty() { return None; } Some(SessionSummary { title, - description: fields.description.unwrap_or_default(), - saved_at: fields.saved_at.unwrap_or_default(), + 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());