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 is_null(&self) -> bool {
31 matches!(self, JsonValue::Null)
32 }
33
34 pub fn as_bool(&self) -> Option<bool> {
36 match self {
37 JsonValue::Bool(b) => Some(*b),
38 _ => None,
39 }
40 }
41
42 pub fn as_number(&self) -> Option<&JsonNumber> {
44 match self {
45 JsonValue::Number(n) => Some(n),
46 _ => None,
47 }
48 }
49
50 pub fn as_str(&self) -> Option<&str> {
52 match self {
53 JsonValue::String(s) => Some(s),
54 _ => None,
55 }
56 }
57
58 pub fn as_array(&self) -> Option<&[JsonValue]> {
60 match self {
61 JsonValue::Array(a) => Some(a),
62 _ => None,
63 }
64 }
65
66 pub fn as_object(&self) -> Option<&JsonObject> {
68 match self {
69 JsonValue::Object(o) => Some(o),
70 _ => None,
71 }
72 }
73}
74
75#[derive(Debug, Clone, PartialEq)]
77pub struct JsonMember {
78 key: String,
79 value: JsonValue,
80}
81
82impl JsonMember {
83 pub fn key(&self) -> &str {
85 &self.key
86 }
87
88 pub fn value(&self) -> &JsonValue {
90 &self.value
91 }
92}
93
94#[derive(Debug, Clone, PartialEq, Default)]
101pub struct JsonObject {
102 entries: Vec<JsonMember>,
103}
104
105impl JsonObject {
106 pub fn new() -> Self {
108 Self {
109 entries: Vec::new(),
110 }
111 }
112
113 pub(crate) fn push_unique(&mut self, key: String, value: JsonValue) {
114 self.entries.push(JsonMember { key, value });
115 }
116
117 pub fn get(&self, key: &str) -> Option<&JsonValue> {
119 self.entries.iter().find(|m| m.key == key).map(|m| &m.value)
120 }
121
122 pub fn contains_key(&self, key: &str) -> bool {
124 self.entries.iter().any(|m| m.key == key)
125 }
126
127 pub fn insert(&mut self, key: String, value: JsonValue) -> Option<JsonValue> {
131 if let Some(member) = self.entries.iter_mut().find(|m| m.key == key) {
132 Some(core::mem::replace(&mut member.value, value))
133 } else {
134 self.entries.push(JsonMember { key, value });
135 None
136 }
137 }
138
139 pub fn len(&self) -> usize {
141 self.entries.len()
142 }
143
144 pub fn is_empty(&self) -> bool {
146 self.entries.is_empty()
147 }
148
149 pub fn iter(&self) -> core::slice::Iter<'_, JsonMember> {
151 self.entries.iter()
152 }
153}