Skip to main content

rstask_core/
preferences.rs

1use serde::Deserialize;
2use std::fs;
3use std::path::PathBuf;
4
5#[derive(Debug, Deserialize, Clone, Copy, PartialEq)]
6#[serde(rename_all = "snake_case")]
7pub enum SyncFrequency {
8    Never,
9    AfterEveryModification,
10}
11
12#[allow(clippy::derivable_impls)]
13impl Default for SyncFrequency {
14    fn default() -> Self {
15        SyncFrequency::Never
16    }
17}
18
19#[derive(Debug, Deserialize, Clone, Copy, PartialEq)]
20#[serde(rename_all = "snake_case")]
21pub enum BulkCommitStrategy {
22    Single,
23    PerTask,
24}
25
26#[allow(clippy::derivable_impls)]
27impl Default for BulkCommitStrategy {
28    fn default() -> Self {
29        BulkCommitStrategy::Single
30    }
31}
32
33#[derive(Debug, Deserialize, Clone)]
34pub struct Preferences {
35    #[serde(default)]
36    pub sync_frequency: SyncFrequency,
37    #[serde(default)]
38    pub bulk_commit_strategy: BulkCommitStrategy,
39}
40
41impl Default for Preferences {
42    fn default() -> Self {
43        Preferences {
44            sync_frequency: SyncFrequency::Never,
45            bulk_commit_strategy: BulkCommitStrategy::PerTask,
46        }
47    }
48}
49
50impl Preferences {
51    pub fn config_path() -> Option<PathBuf> {
52        dirs::config_dir().map(|config_dir| config_dir.join("rstask").join("config.styx"))
53    }
54
55    /// Load preferences from config file, or return default if file doesn't exist
56    pub fn load() -> Self {
57        let config_path = match Self::config_path() {
58            Some(path) => path,
59            None => return Self::default(),
60        };
61
62        let config_content = match fs::read_to_string(config_path) {
63            Ok(content) => content,
64            Err(_) => return Self::default(),
65        };
66
67        serde_styx::from_str(&config_content).unwrap_or_default()
68    }
69}