summaryrefslogtreecommitdiffstats
path: root/src/history.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/history.rs')
-rw-r--r--src/history.rs55
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)
+ }
+}