quest_tui/
file_handler.rs

1use crate::configs::Configs;
2use crate::{DynResult, Quest, QuestList};
3use directories_next::ProjectDirs;
4use lazy_static::lazy_static;
5use std::{
6    fs, io,
7    path::{Path, PathBuf},
8};
9
10/// Application data and config files path
11struct ProjPaths {
12    data_path: PathBuf,
13    config_path: PathBuf,
14}
15
16lazy_static! {
17    static ref PROJ_PATHS: ProjPaths = {
18        let proj_dirs = ProjectDirs::from("", "", "Quest").unwrap();
19        fs::create_dir_all(proj_dirs.data_dir()).unwrap();
20        fs::create_dir_all(proj_dirs.config_dir()).unwrap();
21
22        let data_path = proj_dirs.data_dir().join("data.json");
23        let config_path = proj_dirs.config_dir().join("config.json");
24
25        ProjPaths {
26            data_path,
27            config_path,
28        }
29    };
30}
31
32/// Load all saved quests from file
33pub fn load_quests() -> Result<Vec<Quest>, io::Error> {
34    if !Path::new(PROJ_PATHS.data_path.as_path()).exists() {
35        fs::File::create(PROJ_PATHS.data_path.as_path())?;
36    }
37
38    let stringified_quests = fs::read_to_string(PROJ_PATHS.data_path.as_path())?;
39    let quest_list: QuestList = serde_json::from_str(&stringified_quests).unwrap_or_default();
40
41    Ok(quest_list.quests)
42}
43
44/// Save all quests to a file
45pub fn save_quests(quests: &[Quest]) -> DynResult {
46    let quests = &QuestList::new(quests);
47    let stringified_quests = serde_json::to_string(quests)?;
48    fs::write(PROJ_PATHS.data_path.as_path(), stringified_quests)?;
49
50    Ok(())
51}
52
53/// Load configs from the file and returns it, if there's no config set, returns default config
54pub fn load_configs() -> Result<Configs, io::Error> {
55    if !Path::new(PROJ_PATHS.config_path.as_path()).exists() {
56        save_configs(&Configs::default()).unwrap();
57    }
58
59    let stringified_configs = fs::read_to_string(PROJ_PATHS.config_path.as_path())?;
60    let configs: Configs = serde_json::from_str(&stringified_configs).unwrap();
61
62    Ok(configs)
63}
64
65/// Save configs to file
66fn save_configs(configs: &Configs) -> DynResult {
67    let stringified_configs = serde_json::to_string_pretty(configs)?;
68    fs::write(PROJ_PATHS.config_path.as_path(), stringified_configs)?;
69
70    Ok(())
71}