diff options
author | metamuffin <yvchraiqi@protonmail.com> | 2022-06-11 16:33:15 +0200 |
---|---|---|
committer | metamuffin <yvchraiqi@protonmail.com> | 2022-06-11 16:33:15 +0200 |
commit | ea37afe9ae9a1607fa3b6f365b9307c579c45b8d (patch) | |
tree | 4e64754887dcd666a54d0f17d4964c5aecf36334 /karld/src/savestate.rs | |
parent | 62836238f63688b45760929bdc2715f8f9991f2f (diff) | |
download | karlender-ea37afe9ae9a1607fa3b6f365b9307c579c45b8d.tar karlender-ea37afe9ae9a1607fa3b6f365b9307c579c45b8d.tar.bz2 karlender-ea37afe9ae9a1607fa3b6f365b9307c579c45b8d.tar.zst |
savestating
Diffstat (limited to 'karld/src/savestate.rs')
-rw-r--r-- | karld/src/savestate.rs | 50 |
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(()) +} |