1use crate::{JsonMaybeArray, JsonMaybeObject, JsonValueCheck, JsonValueWrap};
2use serde_json::{Map, Value};
3
4impl JsonValueWrap for Value {
5 fn as_boolean(&self) -> Option<&bool> {
6 match self {
7 Self::Bool(s) => Some(s),
8 _ => None,
9 }
10 }
11
12 fn as_array(&self) -> Option<&Vec<Self>> {
13 match self {
14 Self::Array(s) => Some(s),
15 _ => None,
16 }
17 }
18
19 fn as_string(&self) -> Option<&String> {
20 match self {
21 Self::String(s) => Some(s),
22 _ => None,
23 }
24 }
25
26 fn as_object(&self) -> Option<&Map<String, Value>> {
27 match self {
28 Self::Object(s) => Some(s),
29 _ => None,
30 }
31 }
32
33 fn into_boolean(self) -> Option<bool> {
34 match self {
35 Self::Bool(s) => Some(s),
36 _ => None,
37 }
38 }
39
40 fn into_string(self) -> Option<String> {
41 match self {
42 Self::String(s) => Some(s),
43 _ => None,
44 }
45 }
46
47 fn into_array(self) -> Option<Vec<Self>> {
48 match self {
49 Self::Array(s) => Some(s),
50 _ => None,
51 }
52 }
53
54 fn into_object(self) -> Option<Map<String, Self>> {
55 match self {
56 Self::Object(o) => Some(o),
57 _ => None,
58 }
59 }
60}
61
62impl JsonValueCheck for Value {
63 fn is_null(&self) -> bool {
64 matches!(self, Self::Null)
65 }
66
67 fn is_empty(&self) -> bool {
68 match self {
69 Self::Array(s) if s.is_empty() => true,
70 Self::Object(s) if s.is_empty() => true,
71 _ => false,
72 }
73 }
74}
75
76impl JsonMaybeArray for Value {
77 fn get_index(&self, index: usize) -> Option<&Self> {
78 match self {
79 Self::Array(s) => s.get(index),
80 _ => None,
81 }
82 }
83
84 fn mut_index(&mut self, index: usize) -> Option<&mut Self> {
85 match self {
86 Self::Array(s) => s.get_mut(index),
87 _ => None,
88 }
89 }
90}
91
92impl JsonMaybeObject for Value {
93 fn get_key(&self, key: &str) -> Option<&Self> {
94 match self {
95 Self::Object(s) => s.get(key),
96 _ => None,
97 }
98 }
99
100 fn mut_key(&mut self, key: &str) -> Option<&mut Self> {
101 match self {
102 Self::Object(s) => s.get_mut(key),
103 _ => None,
104 }
105 }
106
107 fn extract_key(&mut self, key: &str) -> Option<Value> {
108 match self {
109 Self::Object(s) => s.remove(key),
110 _ => None,
111 }
112 }
113}