simple_game_utils/prefs/
app_prefs.rs

1use crate::prefs::*;
2use log::error;
3use serde::Serialize;
4
5const FILE_NAME: &str = "app.prefs";
6const KEY: &str = "settings";
7
8///
9/// # Usage
10///
11/// ```
12///# use serde::{Deserialize, Serialize};
13///# use simple_game_utils::prefs::app_prefs::AppPrefs;
14///# #[derive(Debug, Clone, Serialize, Deserialize, Default)]
15/// struct Settings {
16///     user: String,
17///     theme: usize
18/// }
19///
20/// let mut prefs: AppPrefs<Settings> = AppPrefs::new("com","example","readme", || Settings::default()).unwrap();
21/// println!("{}", prefs.data.user);
22/// prefs.data.user = String::from("New");
23/// prefs.save();
24///```
25///
26#[derive(Debug, Clone)]
27pub struct AppPrefs<T: Sized + Clone + Serialize + DeserializeOwned> {
28    prefs: Preferences<T>,
29    pub data: T,
30}
31
32impl<T: Sized + Clone + Serialize + DeserializeOwned> AppPrefs<T> {
33    pub fn new(
34        qualifier: &str,
35        organization: &str,
36        application: &str,
37        default: fn() -> T,
38    ) -> Result<Self, GameUtilError> {
39        let mut prefs: Preferences<T> = Preferences::new(
40            get_pref_dir(qualifier, organization, application)?,
41            FILE_NAME,
42        );
43        if let Err(e) = prefs.load() {
44            error!("Unable to restore app prefs: {e:?}");
45        }
46        let data = if let Some(data) = prefs.get(KEY) {
47            data.clone()
48        } else {
49            default()
50        };
51        Ok(AppPrefs { prefs, data })
52    }
53}
54
55impl<T: Sized + Clone + Serialize + DeserializeOwned> AppPrefs<T> {
56    pub fn save(&mut self) {
57        self.prefs.set(KEY, self.data.clone());
58        if let Err(e) = self.prefs.save() {
59            error!("Unable to save app prefs: {e:?}");
60        }
61    }
62
63    pub fn reload(&mut self) {
64        if let Err(e) = self.prefs.load() {
65            error!("Unable to reload app prefs: {e:?}");
66        }
67        if let Some(data) = self.prefs.get(KEY) {
68            self.data = data.clone();
69        }
70    }
71}