rstask_core/
preferences.rs1use 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 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}