safe_remove/
config.rs

1use std::fs;
2
3use directories::ProjectDirs;
4use serde::{Deserialize, Serialize};
5
6/// Configuration structure
7#[derive(Debug, Serialize, Deserialize, Default)]
8pub struct Config {
9    pub default_duration: Option<String>,
10}
11
12impl Config {
13    pub fn load() -> Result<Self, String> {
14        let proj_dirs = ProjectDirs::from("com", "larpi", "srm")
15            .ok_or_else(|| "Cannot determine project directories".to_string())?;
16        let config_path = proj_dirs.config_dir();
17        let config_file = config_path.join("config.yaml");
18
19        if config_file.exists() {
20            let contents = fs::read_to_string(config_file)
21                .map_err(|e| format!("Failed to read config file: {}", e))?;
22            serde_yaml::from_str(&contents).map_err(|e| format!("Failed to parse config: {}", e))
23        } else {
24            Ok(Config {
25                default_duration: None,
26            })
27        }
28    }
29
30    pub fn set(&self, key: String, value: String) -> Result<(), String> {
31        let proj_dirs = ProjectDirs::from("com", "larpi", "srm")
32            .ok_or_else(|| "Cannot determine project directories".to_string())?;
33        let config_path = proj_dirs.config_dir();
34        let config_file = config_path.join("config.yaml");
35
36        let mut config = if config_file.exists() {
37            let contents = fs::read_to_string(&config_file)
38                .map_err(|e| format!("Failed to read config file: {}", e))?;
39            serde_yaml::from_str(&contents).map_err(|e| format!("Failed to parse config: {}", e))?
40        } else {
41            Config {
42                default_duration: None,
43            }
44        };
45
46        match key.as_str() {
47            "default_duration" => config.default_duration = Some(value),
48            _ => return Err(format!("Unknown key: {}", key)),
49        }
50
51        let contents = serde_yaml::to_string(&config)
52            .map_err(|e| format!("Failed to serialize config: {}", e))?;
53        // ensure the parent directory exists
54        fs::create_dir_all(config_path)
55            .map_err(|e| format!("Failed to create config directory: {}", e))?;
56
57        fs::write(&config_file, contents)
58            .map_err(|e| format!("Failed to write config file: {}", e))?;
59
60        Ok(())
61    }
62
63    pub fn get(&self, key: String) -> Result<(), String> {
64        match key.as_str() {
65            "default_duration" => {
66                if let Some(duration) = &self.default_duration {
67                    println!("{}", duration);
68                } else {
69                    println!("No default duration set");
70                }
71            }
72            _ => return Err(format!("Unknown key: {}", key)),
73        }
74
75        Ok(())
76    }
77}