reqrio_json/
json_impl.rs

1use std::collections::HashMap;
2use std::error::Error;
3use std::ops::{Index, IndexMut};
4
5use serde::{Deserialize, Deserializer, Serialize, Serializer};
6use serde_json::Value;
7
8use crate::{JsonResult, JsonValue, NULL};
9use crate::number::Number;
10use crate::parser::JsonParser;
11
12impl Index<usize> for JsonValue {
13    type Output = JsonValue;
14
15    fn index(&self, index: usize) -> &Self::Output {
16        match self {
17            JsonValue::Array(vec) => vec.get(index).unwrap_or(&NULL),
18            _ => &NULL
19        }
20    }
21}
22
23impl IndexMut<usize> for JsonValue {
24    fn index_mut(&mut self, index: usize) -> &mut Self::Output {
25        match self {
26            JsonValue::Array( vec) => {
27                let in_bounds = index < vec.len();
28                if in_bounds {
29                    &mut vec[index]
30                } else {
31                    vec.push(JsonValue::Null);
32                    vec.last_mut().unwrap()
33                }
34            }
35            _ => {
36                *self = JsonValue::Array(vec![]);
37                self.push(JsonValue::Null);
38                self.index_mut(index)
39            }
40        }
41    }
42}
43
44impl<'a> Index<&'a str> for JsonValue {
45    type Output = JsonValue;
46
47    fn index(&self, index: &str) -> &JsonValue {
48        match *self {
49            JsonValue::Object(ref object) => &object[index],
50            _ => &NULL
51        }
52    }
53}
54
55impl Index<String> for JsonValue {
56    type Output = JsonValue;
57
58    fn index(&self, index: String) -> &JsonValue {
59        self.index(index.as_str())
60    }
61}
62
63impl<'a> Index<&'a String> for JsonValue {
64    type Output = JsonValue;
65
66    fn index(&self, index: &String) -> &JsonValue {
67        self.index(index.as_str())
68    }
69}
70
71impl<'a> IndexMut<&'a str> for JsonValue {
72    fn index_mut(&mut self, index: &str) -> &mut JsonValue {
73        match *self {
74            JsonValue::Object(ref mut object) => {
75                &mut object[index]
76            }
77            _ => {
78                *self = JsonValue::new_object();
79                self.index_mut(index)
80            }
81        }
82    }
83}
84
85impl IndexMut<String> for JsonValue {
86    fn index_mut(&mut self, index: String) -> &mut JsonValue {
87        self.index_mut(index.as_str())
88    }
89}
90
91impl<'a> IndexMut<&'a String> for JsonValue {
92    fn index_mut(&mut self, index: &String) -> &mut JsonValue {
93        self.index_mut(index.as_str())
94    }
95}
96
97impl Serialize for JsonValue {
98    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
99    where
100        S: Serializer,
101    {
102        let ser_str = match self {
103            JsonValue::String(s) => format!("\"{s}\""),
104            _ => { self.dump() }
105        };
106        let json_value: Value = serde_json::from_str(&ser_str).unwrap();
107        serializer.serialize_some(&json_value)
108    }
109}
110
111impl<'de> Deserialize<'de> for JsonValue {
112    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
113    where
114        D: Deserializer<'de>,
115    {
116        let json_value: Value = Deserialize::deserialize(deserializer)?;
117        let json_str = serde_json::to_string(&json_value).unwrap();
118        Ok(JsonParser::new().parse_json(mh_json::parse(json_str.as_str()).unwrap()).unwrap())
119    }
120}
121
122impl JsonValue {
123    pub fn is_none(&self) -> bool {
124        match self {
125            JsonValue::Null => { true }
126            _ => { false }
127        }
128    }
129
130    pub fn is_string(&self) -> bool {
131        match *self {
132            JsonValue::String(_) => true,
133            _ => false,
134        }
135    }
136
137    pub fn is_number(&self) -> bool {
138        match *self {
139            JsonValue::Number(_) => true,
140            _ => false,
141        }
142    }
143
144    pub fn is_boolean(&self) -> bool {
145        match *self {
146            JsonValue::Boolean(_) => true,
147            _ => false
148        }
149    }
150
151    pub fn is_null(&self) -> bool {
152        match *self {
153            JsonValue::Null => true,
154            _ => false,
155        }
156    }
157
158    pub fn is_object(&self) -> bool {
159        match *self {
160            JsonValue::Object(_) => true,
161            _ => false,
162        }
163    }
164
165    pub fn is_array(&self) -> bool {
166        match *self {
167            JsonValue::Array(_) => true,
168            _ => false,
169        }
170    }
171
172    pub fn as_str(&self) -> JsonResult<&str> {
173        match *self {
174            JsonValue::String(ref value) => Ok(value),
175            _ => Err("parse str error!".into())
176        }
177    }
178
179    pub fn as_number(&self) -> JsonResult<Number> {
180        match self {
181            JsonValue::Number(value) => Ok(value.clone()),
182            JsonValue::String(s) => Ok(Number::F64(s.parse::<f64>()?)),
183            _ => Err("parse number error!".into())
184        }
185    }
186
187    pub fn as_f64(&self) -> JsonResult<f64> {
188        self.as_number()?.as_f64()
189    }
190
191    pub fn as_f32(&self) -> JsonResult<f32> {
192        self.as_number()?.as_f32()
193    }
194
195    pub fn as_u64(&self) -> JsonResult<u64> {
196        self.as_number()?.as_u64()
197    }
198
199    pub fn as_u32(&self) -> JsonResult<u32> {
200        self.as_number()?.as_u32()
201    }
202
203    pub fn as_u16(&self) -> JsonResult<u16> {
204        self.as_number()?.as_u16()
205    }
206
207    pub fn as_u8(&self) -> JsonResult<u8> {
208        self.as_number()?.as_u8()
209    }
210
211    pub fn as_usize(&self) -> JsonResult<usize> {
212        self.as_number()?.as_usize()
213    }
214
215    pub fn as_i64(&self) -> JsonResult<i64> {
216        self.as_number()?.as_i64()
217    }
218
219    pub fn as_i32(&self) -> JsonResult<i32> {
220        self.as_number()?.as_i32()
221    }
222
223    pub fn as_i16(&self) -> JsonResult<i16> {
224        self.as_number()?.as_i16()
225    }
226
227    pub fn as_i8(&self) -> JsonResult<i8> {
228        self.as_number()?.as_i8()
229    }
230
231    pub fn as_isize(&self) -> JsonResult<isize> {
232        self.as_number()?.as_isize()
233    }
234
235    pub fn as_bool(&self) -> JsonResult<bool> {
236        match *self {
237            JsonValue::Boolean(ref value) => Ok(value.clone()),
238            _ => Err("parse bool error!".into())
239        }
240    }
241}
242
243impl From<String> for JsonValue {
244    fn from(value: String) -> Self {
245        JsonValue::String(value)
246    }
247}
248
249impl<'a> From<&'a str> for JsonValue {
250    fn from(value: &'a str) -> Self {
251        JsonValue::String(value.to_string())
252    }
253}
254
255impl<'a> From<&'a String> for JsonValue {
256    fn from(value: &'a String) -> Self {
257        JsonValue::String(value.to_string())
258    }
259}
260
261impl From<i8> for JsonValue {
262    fn from(value: i8) -> Self {
263        JsonValue::Number(Number::I64(value as i64))
264    }
265}
266
267impl From<&i8> for JsonValue {
268    fn from(value: &i8) -> Self {
269        JsonValue::Number(Number::I64(*value as i64))
270    }
271}
272
273impl From<i16> for JsonValue {
274    fn from(value: i16) -> Self {
275        JsonValue::Number(Number::I64(value as i64))
276    }
277}
278
279impl From<&i16> for JsonValue {
280    fn from(value: &i16) -> Self {
281        JsonValue::Number(Number::I64(*value as i64))
282    }
283}
284
285impl From<i32> for JsonValue {
286    fn from(value: i32) -> Self {
287        JsonValue::Number(Number::I64(value as i64))
288    }
289}
290
291impl From<&i32> for JsonValue {
292    fn from(value: &i32) -> Self {
293        JsonValue::Number(Number::I64(*value as i64))
294    }
295}
296
297impl From<i64> for JsonValue {
298    fn from(value: i64) -> Self {
299        JsonValue::Number(Number::I64(value))
300    }
301}
302
303impl From<&i64> for JsonValue {
304    fn from(value: &i64) -> Self {
305        JsonValue::Number(Number::I64(*value))
306    }
307}
308
309impl From<u8> for JsonValue {
310    fn from(value: u8) -> Self {
311        JsonValue::Number(Number::U64(value as u64))
312    }
313}
314
315impl From<u16> for JsonValue {
316    fn from(value: u16) -> Self {
317        JsonValue::Number(Number::U64(value as u64))
318    }
319}
320
321impl From<u32> for JsonValue {
322    fn from(value: u32) -> Self {
323        JsonValue::Number(Number::U64(value as u64))
324    }
325}
326
327impl From<u64> for JsonValue {
328    fn from(value: u64) -> Self {
329        JsonValue::Number(Number::U64(value))
330    }
331}
332
333impl From<u128> for JsonValue {
334    fn from(value: u128) -> Self {
335        JsonValue::Number(Number::U64(value as u64))
336    }
337}
338
339impl From<f32> for JsonValue {
340    fn from(value: f32) -> Self {
341        JsonValue::Number(Number::F64(value as f64))
342    }
343}
344
345impl From<&f32> for JsonValue {
346    fn from(value: &f32) -> Self {
347        JsonValue::Number(Number::F64(*value as f64))
348    }
349}
350
351impl From<f64> for JsonValue {
352    fn from(value: f64) -> Self {
353        JsonValue::Number(Number::F64(value))
354    }
355}
356
357impl From<&f64> for JsonValue {
358    fn from(value: &f64) -> Self {
359        JsonValue::Number(Number::F64(*value))
360    }
361}
362
363impl From<usize> for JsonValue {
364    fn from(value: usize) -> Self {
365        JsonValue::Number(Number::I64(value as i64))
366    }
367}
368
369impl From<bool> for JsonValue {
370    fn from(value: bool) -> Self {
371        JsonValue::Boolean(value)
372    }
373}
374
375impl From<&bool> for JsonValue {
376    fn from(value: &bool) -> Self {
377        JsonValue::Boolean(*value)
378    }
379}
380
381impl<T> From<Vec<T>> for JsonValue
382where
383    T: Into<JsonValue>,
384{
385    fn from(value: Vec<T>) -> Self {
386        let mut array = JsonValue::new_array();
387        for v in value {
388            array.push(v.into());
389        }
390        array
391    }
392}
393
394
395impl<'a, T> From<HashMap<&'a str, T>> for JsonValue
396where
397    T: Into<JsonValue>,
398{
399    fn from(value: HashMap<&'a str, T>) -> Self {
400        let mut object = JsonValue::new_object();
401        for (k, v) in value {
402            object.insert(k, v.into()).unwrap();
403        }
404        object
405    }
406}
407
408impl<T> From<HashMap<String, T>> for JsonValue
409where
410    T: Into<JsonValue>,
411{
412    fn from(value: HashMap<String, T>) -> Self {
413        let mut object = JsonValue::new_object();
414        for (k, v) in value {
415            object.insert(k.as_str(), v.into()).unwrap();
416        }
417        object
418    }
419}
420
421impl<'a, T: Clone> From<&'a [T]> for JsonValue
422where
423    T: Into<JsonValue>,
424{
425    fn from(value: &'a [T]) -> Self {
426        let mut array = JsonValue::new_array();
427        for v in value {
428            array.push(v.clone().into())
429        };
430        array
431    }
432}
433
434impl<T> From<Option<T>> for JsonValue
435where
436    T: Into<JsonValue>,
437{
438    fn from(value: Option<T>) -> Self {
439        match value {
440            None => { JsonValue::Null }
441            Some(v) => { v.into() }
442        }
443    }
444}
445
446impl Into<Box<dyn Error>> for JsonValue {
447    fn into(self) -> Box<dyn Error> {
448        Box::from(self.to_string())
449    }
450}
451
452
453impl Into<mh_json::JsonValue> for JsonValue {
454    fn into(self) -> mh_json::JsonValue {
455        match self {
456            JsonValue::Null => mh_json::Null,
457            JsonValue::String(s) => mh_json::JsonValue::String(s),
458            JsonValue::Number(n) => {
459                match n {
460                    Number::U64(u) => { mh_json::JsonValue::Number(mh_json::number::Number::from(u)) }
461                    Number::I64(i) => { mh_json::JsonValue::Number(mh_json::number::Number::from(i)) }
462                    Number::F64(f) => { mh_json::JsonValue::Number(mh_json::number::Number::from(f)) }
463                }
464            }
465            JsonValue::Boolean(b) => mh_json::JsonValue::Boolean(b),
466            JsonValue::Object(o) => o.into(),
467            JsonValue::Array(a) => a.into()
468        }
469    }
470}