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
62
63
64
65
66
67
68
69
70
71
72
use serde_json::Map;

pub trait JsonMaybeObject: JsonValueWrap
where
    Self: Sized,
{
    fn get_key(&self, key: &str) -> Option<&Self>;
    fn extract_key(&mut self, key: &str) -> Option<Self>;

    #[inline]
    fn get_key_string(&self, key: &str) -> Option<&String> {
        self.get_key(key).and_then(|f| f.as_string())
    }

    fn get_key_as_boolean(&self, key: &str) -> Option<&bool> {
        self.get_key(key).and_then(|f| f.as_boolean())
    }
    #[inline]
    fn get_key_as_array(&self, key: &str) -> Option<&Vec<Self>> {
        self.get_key(key).and_then(|f| f.as_array())
    }
    #[inline]
    fn get_key_as_object(&self, key: &str) -> Option<&Map<String, Self>> {
        self.get_key(key).and_then(|f| f.as_object())
    }
    #[inline]
    fn extract_key_as_object(&mut self, key: &str) -> Option<Map<String, Self>> {
        self.extract_key(key).and_then(|f| f.into_object())
    }
}

pub trait JsonValueWrap
where
    Self: Sized,
{
    fn as_boolean(&self) -> Option<&bool>;
    fn as_array(&self) -> Option<&Vec<Self>>;
    fn as_string(&self) -> Option<&String>;
    fn as_object(&self) -> Option<&Map<String, Self>>;
    fn into_string(self) -> Option<String>;
    fn into_array(self) -> Option<Vec<Self>>;
    fn into_object(self) -> Option<Map<String, Self>>;
}

pub trait JsonValueCheck: JsonValueWrap
where
    Self: Sized,
{
    fn is_null(&self) -> bool;
    fn is_empty(&self) -> bool;

    #[inline]
    fn is_boolean(&self) -> bool {
        self.as_boolean().is_some()
    }
    #[inline]
    fn is_true(&self) -> bool {
        matches!(self.as_boolean(), Some(true))
    }
    #[inline]
    fn is_false(&self) -> bool {
        matches!(self.as_boolean(), Some(false))
    }
    #[inline]
    fn is_string(&self) -> bool {
        self.as_string().is_some()
    }
    #[inline]
    fn is_array(&self) -> bool {
        self.as_array().is_some()
    }
}