use std::{
io,
path::PathBuf,
time::{SystemTime, UNIX_EPOCH},
};
use reovim_arch::dirs::data_local_dir;
use super::{ClientId, ClientRingBuffer};
#[must_use]
pub fn crash_dir() -> PathBuf {
data_local_dir()
.unwrap_or_else(|| PathBuf::from("."))
.join("reovim")
.join("crash")
}
pub fn dump_client_to_file(
client_id: ClientId,
ring_buffer: &ClientRingBuffer,
) -> io::Result<PathBuf> {
let dir = crash_dir();
std::fs::create_dir_all(&dir)?;
let timestamp = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map_or(0, |d| d.as_secs());
let filename = format!("client-{}-{}.log", client_id.as_usize(), timestamp);
let path = dir.join(&filename);
let events = ring_buffer
.try_dump()
.unwrap_or_else(|| "Failed to acquire lock".to_string());
let content = format!(
"Client Debug Dump\n\
=================\n\n\
Client ID: {}\n\
Timestamp: {}\n\n\
Event Log:\n\
----------\n\
{}\n",
client_id.as_usize(),
timestamp,
events
);
std::fs::write(&path, content)?;
Ok(path)
}
pub fn try_dump_client_to_file(
client_id: ClientId,
ring_buffer: &ClientRingBuffer,
) -> Option<PathBuf> {
let dir = crash_dir();
std::fs::create_dir_all(&dir).ok()?;
let timestamp = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map_or(0, |d| d.as_secs());
let filename = format!("client-{}-{}.log", client_id.as_usize(), timestamp);
let path = dir.join(&filename);
let events = ring_buffer.try_dump()?;
let content = format!(
"Client Debug Dump\n\
=================\n\n\
Client ID: {}\n\
Timestamp: {}\n\n\
Event Log:\n\
----------\n\
{}\n",
client_id.as_usize(),
timestamp,
events
);
std::fs::write(&path, &content).ok()?;
Some(path)
}
#[cfg(test)]
#[path = "crash_dump_tests.rs"]
mod tests;