1use alloc::string::String;
4use alloc::vec::Vec;
5
6use crate::number::JsonNumber;
7
8#[derive(Debug, Clone, PartialEq)]
13pub enum JsonValue {
14 Null,
16 Bool(bool),
18 Number(JsonNumber),
20 String(String),
22 Array(Vec<JsonValue>),
24 Object(JsonObject),
26}
27
28impl JsonValue {
29 pub fn array<I: IntoIterator<Item = JsonValue>>(items: I) -> Self {
31 JsonValue::Array(items.into_iter().collect())
32 }
33
34 pub fn is_null(&self) -> bool {
36 matches!(self, JsonValue::Null)
37 }
38
39 pub fn as_bool(&self) -> Option<bool> {
41 match self {
42 JsonValue::Bool(b) => Some(*b),
43 _ => None,
44 }
45 }
46
47 pub fn as_number(&self) -> Option<&JsonNumber> {
49 match self {
50 JsonValue::Number(n) => Some(n),
51 _ => None,
52 }
53 }
54
55 pub fn as_str(&self) -> Option<&str> {
57 match self {
58 JsonValue::String(s) => Some(s),
59 _ => None,
60 }
61 }
62
63 pub fn as_array(&self) -> Option<&[JsonValue]> {
65 match self {
66 JsonValue::Array(a) => Some(a),
67 _ => None,
68 }
69 }
70
71 pub fn as_object(&self) -> Option<&JsonObject> {
73 match self {
74 JsonValue::Object(o) => Some(o),
75 _ => None,
76 }
77 }
78}
79
80#[derive(Debug, Clone, PartialEq)]
82pub struct JsonMember {
83 key: String,
84 value: JsonValue,
85}
86
87impl JsonMember {
88 pub fn key(&self) -> &str {
90 &self.key
91 }
92
93 pub fn value(&self) -> &JsonValue {
95 &self.value
96 }
97}
98
99#[derive(Debug, Clone, PartialEq, Default)]
106pub struct JsonObject {
107 entries: Vec<JsonMember>,
108}
109
110impl JsonObject {
111 pub fn new() -> Self {
113 Self {
114 entries: Vec::new(),
115 }
116 }
117
118 pub(crate) fn push_unique(&mut self, key: String, value: JsonValue) {
119 self.entries.push(JsonMember { key, value });
120 }
121
122 pub fn get(&self, key: &str) -> Option<&JsonValue> {
124 self.entries.iter().find(|m| m.key == key).map(|m| &m.value)
125 }
126
127 pub fn contains_key(&self, key: &str) -> bool {
129 self.entries.iter().any(|m| m.key == key)
130 }
131
132 pub fn insert(&mut self, key: String, value: JsonValue) -> Option<JsonValue> {
136 if let Some(member) = self.entries.iter_mut().find(|m| m.key == key) {
137 Some(core::mem::replace(&mut member.value, value))
138 } else {
139 self.entries.push(JsonMember { key, value });
140 None
141 }
142 }
143
144 pub fn len(&self) -> usize {
146 self.entries.len()
147 }
148
149 pub fn is_empty(&self) -> bool {
151 self.entries.is_empty()
152 }
153
154 pub fn iter(&self) -> core::slice::Iter<'_, JsonMember> {
156 self.entries.iter()
157 }
158}