1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
use std::path::PathBuf;
use serde_yaml::{Value, Mapping};

#[cfg(test)]
mod tests {
    #[test]
    fn it_works() {
        assert_eq!(2 + 2, 4);
    }
}


#[derive(Debug, Clone)]
pub struct Config {
	pub path: PathBuf,
	mapping: Mapping
}

impl Config {
	pub fn new(path: PathBuf) -> Self {
		Self {
			path,
			mapping: Mapping::new()
		}
	}

	pub fn init(&mut self) {
		if !self.path.exists() {
			let path_parent = self.path.parent().unwrap();
			if !path_parent.exists() {
				std::fs::create_dir_all(path_parent).unwrap();
			}
			std::fs::write(&self.path, serde_yaml::to_string(&Mapping::new()).unwrap()).unwrap();
		}
	}

	pub fn load(&mut self) {
		self.mapping = serde_yaml::from_str(&std::fs::read_to_string(&self.path).unwrap()).unwrap();
	}

	pub fn save(&mut self) {
		std::fs::write(&self.path, serde_yaml::to_string(&self.mapping).unwrap()).unwrap();
	}

	pub fn set_default(&mut self, key: &str, value: Value){
		let key = Value::String(key.to_owned());
		if self.mapping.get(&key).is_none() {
			self.mapping.insert(key, value);
		}
	}

	pub fn get(&self, key: &str) -> Option<&Value> {
		let key = Value::String(key.to_owned());
		self.mapping.get(&key)
	}

	pub fn set(&mut self, key: &str, value: Value) {
		let key = Value::String(key.to_owned());
		self.mapping.insert(key, value);
	}
}