dev_tool/
conf_util_yaml.rs1use crate::FileUtil;
2use serde_yaml::Value;
3use std::path::Path;
4
5#[derive(Debug)]
6pub struct YamlWrapper {
7 pub file_path: String,
8 pub raw_data: String,
9 pub data: Value,
10}
11
12pub struct ValueWrapper<'a> {
13 value: &'a Value,
14}
15
16impl<'a> ValueWrapper<'a> {
17 pub fn new(value: &'a Value) -> Self {
25 Self { value }
26 }
27
28 pub fn get(&self, key: &'a str) -> Vec<&'a Value> {
39 let mut results = Vec::new();
40 if let Some((left, right)) = key.split_once(".") {
41 let x = self.value.get(left);
43 if x.is_none() {
44 results.push(&Value::Null);
45 } else {
46 let x = x.unwrap();
47 let next = ValueWrapper::new(x);
48 results.append(&mut next.get(right));
49 }
50 } else {
51 match self.value {
53 Value::Mapping(map) => {
54 if let Some(v) = map.get(key) {
56 results.push(v);
57 } else {
58 results.push(&Value::Null);
59 }
60 }
61 Value::Sequence(vec) => {
62 for item in vec {
64 match item.get(key) {
65 Some(v) => results.push(v),
66 None => results.push(&Value::Null),
67 }
68 }
69 }
70 _ => results.push(&Value::Null),
71 }
72 }
73 results
74 }
75}
76
77impl YamlWrapper {
78 pub fn new(file_path: &str) -> Result<Self, Box<dyn std::error::Error>> {
91 let conf_string = FileUtil::read_string(Path::new(file_path))?;
93 let data: Value = serde_yaml::from_str(&conf_string)?;
95 Ok(Self {
96 file_path: file_path.to_string(),
97 raw_data: conf_string,
98 data,
99 })
100 }
101
102 pub fn get<'a, 'b: 'a>(&'a self, key: &'b str) -> Vec<&'a Value> {
112 let wrapper = ValueWrapper::new(&self.data);
113 wrapper.get(key)
114 }
115
116 pub fn get_one<'a, 'b: 'a>(&'a self, key: &'b str) -> &'a Value {
127 let wrapper = ValueWrapper::new(&self.data);
130 let vec = wrapper.get(key);
132 vec.first().unwrap()
134 }
135}
136
137#[cfg(test)]
138mod tests {
139
140 use super::*;
141
142 #[test]
143 fn test_json_conf_util() {
144
145 let wrapper = YamlWrapper::new("docs/config.yaml").unwrap();
146
147 let x = wrapper.get("name");
148 println!("name = {:?}", x);
150
151 let x = wrapper.get("age");
152 println!("age = {:?}", x);
154
155 let x = wrapper.get("is_student");
156 println!("is_student = {:?}", x);
158
159 let x = wrapper.get("hobbies");
160 println!("hobbies = {:?}", x);
162
163 let x = wrapper.get("address");
164 println!("address = {:?}", x);
166
167 let x = wrapper.get("address.street");
168 println!("address.street = {:?}", x);
170
171 let x = wrapper.get("address.releases");
172 println!("address.releases = {:?}", x);
174
175 let x = wrapper.get("address.x.y");
176 println!("address.x.y = {:?}", x);
178
179 let x = wrapper.get("address.children.name");
180 println!("address.children.name = {:?}", x);
182 println!("=============================================================");
183
184 let name = wrapper.get_one("name").as_str().unwrap();
185 let age = wrapper.get_one("age").as_i64().unwrap();
186 println!("name = {:?}", name);
187 println!("age = {:?}", age);
188
189 let key = String::from("address.x.y");
190 let x = wrapper.get_one(&key).as_str().unwrap();
191 println!("address.x.y = {}", x);
193
194 }
195}