1use crate::FileUtil;
2use serde_json::Value;
3use std::io;
4use std::path::Path;
5
6#[derive(Debug)]
7pub struct JsonWrapper {
8 pub file_path: String,
9 pub raw_data: String,
10 pub data: Value,
11}
12
13pub struct ValueWrapper<'a> {
14 value: &'a Value,
15}
16
17impl<'a> ValueWrapper<'a> {
18 pub fn new(value: &'a Value) -> Self {
26 Self { value }
27 }
28
29 pub fn get(&self, key: &'a str) -> Vec<&'a Value> {
40 let mut results = Vec::new();
41 if let Some((left, right)) = key.split_once(".") {
42 let x = self.value.get(left);
44 if x.is_none() {
45 results.push(&Value::Null);
46 } else {
47 let x = x.unwrap();
48 let next = ValueWrapper::new(x);
49 results.append(&mut next.get(right));
50 }
51 } else {
52 match self.value {
54 Value::Object(map) => {
55 if let Some(v) = map.get(key) {
57 results.push(v);
58 } else {
59 results.push(&Value::Null);
60 }
61 }
62 Value::Array(vec) => {
63 for item in vec {
65 match item.get(key) {
66 Some(v) => results.push(v),
67 None => results.push(&Value::Null),
68 }
69 }
70 }
71 _ => results.push(&Value::Null),
72 }
73 }
74 results
75 }
76}
77
78impl JsonWrapper {
79 pub fn new(file_path: &str) -> io::Result<Self> {
92 let conf_string = FileUtil::read_string(Path::new(file_path))?;
94 let data: Value = serde_json::from_str(&conf_string)?;
96 Ok(Self {
97 file_path: file_path.to_string(),
98 raw_data: conf_string,
99 data,
100 })
101 }
102
103 pub fn get(&self, key: &'static str) -> Vec<&Value> {
113 let wrapper = ValueWrapper::new(&self.data);
114 wrapper.get(key)
115 }
116
117 pub fn get_one(&self, key: &'static str) -> &Value {
128 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 let json_wrapper = JsonWrapper::new("docs/config.json").unwrap();
145
146 let x = json_wrapper.get("name");
147 println!("name = {:?}", x);
149
150 let x = json_wrapper.get("age");
151 println!("age = {:?}", x);
153
154 let x = json_wrapper.get("is_student");
155 println!("is_student = {:?}", x);
157
158 let x = json_wrapper.get("hobbies");
159 println!("hobbies = {:?}", x);
161
162 let x = json_wrapper.get("address");
163 println!("address = {:?}", x);
165
166 let x = json_wrapper.get("address.street");
167 println!("address.street = {:?}", x);
169
170 let x = json_wrapper.get("address.releases");
171 println!("address.releases = {:?}", x);
173
174 let x = json_wrapper.get("address.x.y");
175 println!("address.x.y = {:?}", x);
177
178 let x = json_wrapper.get("address.children.name");
179 println!("address.children.name = {:?}", x);
181 println!("=============================================================");
182
183 let name = json_wrapper.get_one("name").as_str().unwrap();
184 let age = json_wrapper.get_one("age").as_i64().unwrap();
185 println!("name = {:?}", name);
186 println!("age = {:?}", age);
187 }
188}