aboutsummaryrefslogtreecommitdiff
path: root/karld/src/savestate.rs
diff options
context:
space:
mode:
authormetamuffin <yvchraiqi@protonmail.com>2022-06-11 16:33:15 +0200
committermetamuffin <yvchraiqi@protonmail.com>2022-06-11 16:33:15 +0200
commitea37afe9ae9a1607fa3b6f365b9307c579c45b8d (patch)
tree4e64754887dcd666a54d0f17d4964c5aecf36334 /karld/src/savestate.rs
parent62836238f63688b45760929bdc2715f8f9991f2f (diff)
downloadkarlender-ea37afe9ae9a1607fa3b6f365b9307c579c45b8d.tar
karlender-ea37afe9ae9a1607fa3b6f365b9307c579c45b8d.tar.bz2
karlender-ea37afe9ae9a1607fa3b6f365b9307c579c45b8d.tar.zst
savestating
Diffstat (limited to 'karld/src/savestate.rs')
-rw-r--r--karld/src/savestate.rs50
1 files changed, 50 insertions, 0 deletions
diff --git a/karld/src/savestate.rs b/karld/src/savestate.rs
new file mode 100644
index 0000000..a97528c
--- /dev/null
+++ b/karld/src/savestate.rs
@@ -0,0 +1,50 @@
+use karlcommon::Task;
+use log::{error, info};
+
+use crate::TASKS;
+use std::{
+ collections::BTreeMap,
+ fs::{create_dir_all, File},
+ io,
+ path::{Path, PathBuf},
+};
+
+fn save_dir() -> PathBuf {
+ std::env::var("XDG_DATA_HOME")
+ .map(|p| Path::new(p.as_str()).to_path_buf())
+ .unwrap_or_else(|_| {
+ Path::new(&std::env::var("HOME").expect("$HOME needs to be set"))
+ .to_path_buf()
+ .join(".local")
+ .join("share")
+ })
+ .join("karl")
+}
+
+pub fn save() {
+ if let Err(r) = save_inner() {
+ error!("save failed: {}", r);
+ }
+}
+
+pub fn save_inner() -> io::Result<()> {
+ info!("saving...");
+ create_dir_all(save_dir())?;
+ let file = File::create(save_dir().join("tasks"))?;
+ serde_json::to_writer(file, &TASKS.read().unwrap().to_owned())?;
+ info!("done");
+ Ok(())
+}
+
+pub fn load() -> io::Result<()> {
+ info!("loading savestate...");
+ let file = File::open(save_dir().join("tasks"))?;
+ let tasks: BTreeMap<u64, Task> = serde_json::from_reader(file)?;
+
+ let mut guard = TASKS.write().unwrap();
+ guard.clear();
+ guard.extend(tasks.into_iter());
+ info!("done");
+
+ Ok(())
+}