aboutsummaryrefslogtreecommitdiff
path: root/karld/src/savestate.rs
blob: a97528c449894df3996d93d7ffb95b097a716d34 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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(())
}