1use std::fs;
2
3use directories::ProjectDirs;
4use serde::{Deserialize, Serialize};
5
6#[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 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}