use std::fs::OpenOptions;
use std::io::Write;
use std::path::PathBuf;
use crate::analytics::event::Event;
pub fn log_path() -> PathBuf {
if let Ok(custom) = std::env::var("SIDEKICK_EVENTS_PATH") {
return PathBuf::from(custom);
}
let base = dirs::data_local_dir().unwrap_or_else(std::env::temp_dir);
base.join("sidekick").join("events.jsonl")
}
pub fn append(event: &Event) {
let _ = try_append(event);
}
fn try_append(event: &Event) -> anyhow::Result<()> {
let path = log_path();
if let Some(parent) = path.parent() {
std::fs::create_dir_all(parent)?;
}
let mut line = serde_json::to_vec(event)?;
line.push(b'\n');
let mut file = OpenOptions::new().create(true).append(true).open(&path)?;
file.write_all(&line)?;
Ok(())
}
pub fn read_all() -> anyhow::Result<Vec<Event>> {
let path = log_path();
if !path.exists() {
return Ok(Vec::new());
}
let content = std::fs::read_to_string(&path)?;
let mut events = Vec::with_capacity(content.lines().count());
for line in content.lines() {
if line.trim().is_empty() {
continue;
}
if let Ok(event) = serde_json::from_str::<Event>(line) {
events.push(event);
}
}
Ok(events)
}