diff options
Diffstat (limited to 'src/history.rs')
-rw-r--r-- | src/history.rs | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/history.rs b/src/history.rs new file mode 100644 index 0000000..9d29468 --- /dev/null +++ b/src/history.rs @@ -0,0 +1,55 @@ +use std::{ + fs::File, + io::{BufRead, BufReader}, + path::PathBuf, +}; + +use directories::ProjectDirs; + +use crate::Session; + +use super::SessionSource; + +#[derive(Debug)] +pub struct History(PathBuf); + +impl History { + pub fn new(history_file: PathBuf) -> Self { + Self(history_file) + } + + pub fn default_path() -> Option<PathBuf> { + ProjectDirs::from("", "", env!("CARGO_CRATE_NAME"))? + .state_dir()? + .join("history") + .into() + } +} + +impl SessionSource for History { + type Error = std::io::Error; + + type Iter = Vec<Session>; + + fn sessions(&self) -> Result<Self::Iter, Self::Error> { + let mut sessions = Vec::new(); + + let file = File::open(&self.0)?; + for res in BufReader::new(file).lines() { + let entry = match res { + Ok(entry) => entry, + Err(err) => { + tracing::warn!(?err, "Failed to read line from history file"); + continue; + } + }; + + match ron::from_str(&entry) { + Ok(session) => sessions.push(session), + Err(err) => tracing::warn!(?err, "Invalid history entry"), + } + } + + Ok(sessions) + } +} |