quest_tui/
file_handler.rs1use 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
10struct 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
32pub 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
44pub 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
53pub 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
65fn 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}