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<'a, 'b: 'a>(&'a self, key: &'b str) -> Vec<&'a Value> {
113 let wrapper = ValueWrapper::new(&self.data);
114 wrapper.get(key)
115 }
116
117 pub fn get_one<'a, 'b: 'a>(&'a self, key: &'b str) -> &'a Value {
128 let wrapper = ValueWrapper::new(&self.data);
131 let vec = wrapper.get(key);
133 vec.first().unwrap()
135 }
136}
137
138#[cfg(test)]
139mod tests {
140
141 use super::*;
142
143 #[test]
144 fn test_json_conf_util() {
145
146 let json_wrapper = JsonWrapper::new("docs/config.json").unwrap();
147
148 let x = json_wrapper.get("name");
149 println!("name = {:?}", x);
151
152 let x = json_wrapper.get("age");
153 println!("age = {:?}", x);
155
156 let x = json_wrapper.get("is_student");
157 println!("is_student = {:?}", x);
159
160 let x = json_wrapper.get("hobbies");
161 println!("hobbies = {:?}", x);
163
164 let x = json_wrapper.get("address");
165 println!("address = {:?}", x);
167
168 let x = json_wrapper.get("address.street");
169 println!("address.street = {:?}", x);
171
172 let x = json_wrapper.get("address.releases");
173 println!("address.releases = {:?}", x);
175
176 let x = json_wrapper.get("address.x.y");
177 println!("address.x.y = {:?}", x);
179
180 let x = json_wrapper.get("address.children.name");
181 println!("address.children.name = {:?}", x);
183 println!("=============================================================");
184
185 let name = json_wrapper.get_one("name").as_str().unwrap();
186 let age = json_wrapper.get_one("age").as_i64().unwrap();
187 println!("name = {:?}", name);
188 println!("age = {:?}", age);
189
190 let key = String::from("address.x.y");
191 let x = json_wrapper.get_one(&key).as_str().unwrap();
192 println!("address.x.y = {}", x);
194
195 }
196}