1 // Copyright (c) 2023 Huawei Device Co., Ltd. 2 // Licensed under the Apache License, Version 2.0 (the "License"); 3 // you may not use this file except in compliance with the License. 4 // You may obtain a copy of the License at 5 // 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 use crate::JsonValue; 15 use core::fmt::{Debug, Display, Formatter}; 16 use core::slice::{Iter, IterMut}; 17 18 /// Object type, implemented using Vec. 19 /// 20 /// # Situation 21 /// 1. When the average number of entries x under Object is about 15 <= x <= 100. 22 /// 23 /// 2. When the average number of Object entries x is about 101 <= x <= 1024, and the creation to 24 /// query ratio (the average number of queries created once) < 600. 25 /// 26 /// 3. When the average number of objects x is about 1025 <= x <= 10000, and the creation to 27 /// query ratio (the average number of queries created once) < 500. 28 /// 29 /// # Attention 30 /// * Only opening the 'vec_object' feature, this Object type can be used , and it conflicts with other Objects. 31 /// 32 /// * This Object ** does not provide the ** de-duplicate function. 33 /// * Users are required to ensure that there are no duplicate entries. 34 /// 35 /// * The output order of this Object is the same as the insertion order. 36 /// # Examples 37 /// ``` 38 /// use ylong_json::Object; 39 /// 40 /// let object = Object::new(); 41 /// assert_eq!(object.is_empty(), true); 42 /// ``` 43 #[derive(Default, Clone)] 44 pub struct Object { 45 inner: Vec<(String, JsonValue)>, 46 } 47 48 impl Object { 49 /// Creates an empty Object. 50 /// 51 /// # Examples 52 /// ``` 53 /// use ylong_json::Object; 54 /// 55 /// let object = Object::new(); 56 /// assert_eq!(object.is_empty(), true); 57 /// ``` new() -> Self58 pub fn new() -> Self { 59 Self { inner: Vec::new() } 60 } 61 62 /// Gets the length of Object. 63 /// 64 /// # Examples 65 /// ``` 66 /// use ylong_json::{JsonValue, Object}; 67 /// 68 /// let mut object = Object::new(); 69 /// assert_eq!(object.len(), 0); 70 /// object.insert(String::from("null"), JsonValue::Null); 71 /// assert_eq!(object.len(), 1); 72 /// ``` len(&self) -> usize73 pub fn len(&self) -> usize { 74 self.inner.len() 75 } 76 77 /// Determines whether the Object is empty. 78 /// 79 /// # Examples 80 /// ``` 81 /// use ylong_json::{JsonValue, Object}; 82 /// 83 /// let mut object = Object::new(); 84 /// assert_eq!(object.is_empty(), true); 85 /// object.insert(String::from("null"), JsonValue::Null); 86 /// assert_eq!(object.is_empty(), false); 87 /// ``` is_empty(&self) -> bool88 pub fn is_empty(&self) -> bool { 89 self.inner.is_empty() 90 } 91 92 /// Checks whether the specified key exists in the Object. 93 /// 94 /// # Examples 95 /// ``` 96 /// use ylong_json::{JsonValue, Object, Number}; 97 /// 98 /// let mut object = Object::new(); 99 /// object.insert(String::from("null"), JsonValue::Null); 100 /// 101 /// assert_eq!(object.contains_key("null"), true); 102 /// assert_eq!(object.contains_key("no_such_key"), false); 103 /// ``` contains_key(&self, key: &str) -> bool104 pub fn contains_key(&self, key: &str) -> bool { 105 self.inner.iter().any(|(k, _)| k == key) 106 } 107 108 /// Inserts the specified key and value into an Object, appending them to the end without deduplication. 109 /// 110 /// # Examples 111 /// ``` 112 /// use ylong_json::{JsonValue, Object}; 113 /// 114 /// let mut object = Object::new(); 115 /// assert_eq!(object.len(), 0); 116 /// object.insert(String::from("null"), JsonValue::Null); 117 /// assert_eq!(object.len(), 1); 118 /// ``` insert(&mut self, key: String, value: JsonValue)119 pub fn insert(&mut self, key: String, value: JsonValue) { 120 self.inner.push((key, value)) 121 } 122 123 /// Removes the element under the specified key from the Object.If there is an element with 124 /// the same name in the Object, deletes the one with the smallest subscript. 125 /// 126 /// # Examples 127 /// ``` 128 /// use ylong_json::{JsonValue, Object, Number}; 129 /// 130 /// let mut object = Object::new(); 131 /// object.insert(String::from("null"), JsonValue::Null); 132 /// assert_eq!(object.len(), 1); 133 /// assert_eq!(object.remove("null"), Some(JsonValue::Null)); 134 /// assert_eq!(object.len(), 0); 135 /// ``` remove(&mut self, key: &str) -> Option<JsonValue>136 pub fn remove(&mut self, key: &str) -> Option<JsonValue> { 137 let pos = self.inner.iter().position(|(k, _)| k == key)?; 138 Some(self.inner.remove(pos).1) 139 } 140 141 /// Gets a common iterator of Object. 142 /// 143 /// # Examples 144 /// ``` 145 /// use ylong_json::Object; 146 /// 147 /// let object = Object::new(); 148 /// let iter = object.iter(); 149 /// ``` iter(&self) -> Iter<'_, (String, JsonValue)>150 pub fn iter(&self) -> Iter<'_, (String, JsonValue)> { 151 self.inner.iter() 152 } 153 154 /// Gets a mutable iterator of Object. 155 /// 156 /// # Examples 157 /// ``` 158 /// use ylong_json::Object; 159 /// 160 /// let mut object = Object::new(); 161 /// let iter_mut = object.iter_mut(); 162 /// ``` iter_mut(&mut self) -> IterMut<'_, (String, JsonValue)>163 pub fn iter_mut(&mut self) -> IterMut<'_, (String, JsonValue)> { 164 self.inner.iter_mut() 165 } 166 167 /// Gets a common reference to the element in Object with the specified key. 168 /// If there is an element with the same name, returns the one with the smallest subscript. 169 /// 170 /// # Examples 171 /// ``` 172 /// use ylong_json::{JsonValue, Object, Number}; 173 /// 174 /// let mut object = Object::new(); 175 /// object.insert(String::from("test"), JsonValue::Number(Number::from(123))); 176 /// 177 /// assert_eq!(object.get("test"), Some(&JsonValue::Number(Number::from(123)))); 178 /// assert_eq!(object.get("no_such_key"), None); 179 /// ``` get(&self, key: &str) -> Option<&JsonValue>180 pub fn get(&self, key: &str) -> Option<&JsonValue> { 181 self.inner.iter().find(|(k, _)| k == key).map(|(_, v)| v) 182 } 183 184 /// Gets a mutable reference to the element in Object with the specified key. 185 /// If there is an element with the same name, returns the one with the smallest subscript. 186 /// 187 /// # Examples 188 /// ``` 189 /// use ylong_json::{JsonValue, Object}; 190 /// 191 /// let mut object = Object::new(); 192 /// object.insert(String::from("null"), JsonValue::Null); 193 /// 194 /// assert_eq!(object.get_mut("null"), Some(&mut JsonValue::Null)); 195 /// assert_eq!(object.get_mut("no_such_key"), None); 196 /// ``` get_mut(&mut self, key: &str) -> Option<&mut JsonValue>197 pub fn get_mut(&mut self, key: &str) -> Option<&mut JsonValue> { 198 self.inner 199 .iter_mut() 200 .find(|(k, _)| k == key) 201 .map(|(_, v)| v) 202 } 203 204 /// Gets a mutable reference to the last element. last_mut(&mut self) -> Option<&mut JsonValue>205 pub(crate) fn last_mut(&mut self) -> Option<&mut JsonValue> { 206 self.inner.last_mut().map(|(_, v)| v) 207 } 208 get_mut_by_position(&mut self, index: usize) -> Option<&mut JsonValue>209 pub(crate) fn get_mut_by_position(&mut self, index: usize) -> Option<&mut JsonValue> { 210 self.inner.get_mut(index).map(|(_, v)| v) 211 } 212 } 213 214 impl PartialEq for Object { 215 /// Determines whether two objects are equal. 216 /// 217 /// The condition for two objects to be equal is that the two objects are of equal length 218 /// and the key-value pair can be one-to-one and exactly equal. 219 /// 220 /// # Examples 221 /// ``` 222 /// use ylong_json::{Object, JsonValue}; 223 /// 224 /// let object1 = Object::new(); 225 /// let object2 = Object::new(); 226 /// let mut object3 = Object::new(); 227 /// object3.insert("test".to_string(), JsonValue::Null); 228 /// 229 /// assert_eq!(object1, object2); 230 /// assert_ne!(object1, object3); 231 /// ``` eq(&self, other: &Self) -> bool232 fn eq(&self, other: &Self) -> bool { 233 if self.len() != other.len() { 234 return false; 235 } 236 for (k, v) in self.iter() { 237 if other.get(k) != Some(v) { 238 return false; 239 } 240 } 241 true 242 } 243 } 244 245 impl Display for Object { fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result246 fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result { 247 write!(f, "{{")?; 248 for (n, (key, value)) in self.inner.iter().enumerate() { 249 if n != 0 { 250 write!(f, ",")?; 251 } 252 write!(f, "\"{key}\":{value}")?; 253 } 254 write!(f, "}}") 255 } 256 } 257 258 impl Debug for Object { fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result259 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { 260 Display::fmt(self, f) 261 } 262 } 263 264 #[cfg(test)] 265 mod ut_vec { 266 use crate::{JsonValue, Object}; 267 268 /// UT test for `Object::contains_key`. 269 /// 270 /// # Title 271 /// ut_object_contains_key 272 /// 273 /// # Brief 274 /// 1. Creates a `Object`. 275 /// 2. Calls `Object::contains_key` on it. 276 /// 3. Checks if the test results are correct. 277 #[test] ut_object_contains_key()278 fn ut_object_contains_key() { 279 let object = object!("key1" => "value1"); 280 assert!(object.contains_key("key1")); 281 assert!(!object.contains_key("key2")); 282 } 283 284 /// UT test for `Object::iter_mut`. 285 /// 286 /// # Title 287 /// ut_object_iter_mut 288 /// 289 /// # Brief 290 /// 1. Creates a `Object`. 291 /// 2. Calls `Object::iter_mut` on it. 292 /// 3. Checks if the test results are correct. 293 #[test] ut_object_iter_mut()294 fn ut_object_iter_mut() { 295 let mut object = object!("key1" => "value1"); 296 let mut iter_mut = object.iter_mut(); 297 assert_eq!( 298 iter_mut.next(), 299 Some(&mut (String::from("key1"), JsonValue::new_string("value1"))) 300 ); 301 assert_eq!(iter_mut.next(), None); 302 } 303 304 /// UT test for `Object::get_mut`. 305 /// 306 /// # Title 307 /// ut_object_get_mut 308 /// 309 /// # Brief 310 /// 1. Creates a `Object`. 311 /// 2. Calls `Object::get_mut` on it. 312 /// 3. Checks if the test results are correct. 313 #[test] ut_object_get_mut()314 fn ut_object_get_mut() { 315 let mut object = object!("key1" => "value1"); 316 assert_eq!( 317 object.get_mut("key1"), 318 Some(&mut JsonValue::new_string("value1")) 319 ); 320 assert_eq!(object.get_mut("key2"), None); 321 } 322 323 /// UT test for `Object::fmt`. 324 /// 325 /// # Title 326 /// ut_object_fmt 327 /// 328 /// # Brief 329 /// 1. Creates a `Object`. 330 /// 2. Calls `Object::fmt` on it. 331 /// 3. Checks if the test results are correct. 332 #[test] ut_object_fmt()333 fn ut_object_fmt() { 334 let object = object!("key1" => "value1"; "key2" => "value2"); 335 assert_eq!( 336 format!("{object}"), 337 "{\"key1\":\"value1\",\"key2\":\"value2\"}" 338 ); 339 assert_eq!( 340 format!("{object:?}"), 341 "{\"key1\":\"value1\",\"key2\":\"value2\"}" 342 ); 343 } 344 345 /// UT test for `Object::eq`. 346 /// 347 /// # Title 348 /// ut_object_fmt 349 /// 350 /// # Brief 351 /// 1. Creates a `Object`. 352 /// 2. Calls `Object::eq` on it. 353 /// 3. Checks if the test results are correct. 354 #[test] ut_object_eq()355 fn ut_object_eq() { 356 let object1 = object!("key1" => "value1"); 357 let object2 = object!("key1" => "value1"; "key2" => "value2"); 358 let object3 = object!("key1" => "value1"; "key3" => "value3"); 359 360 assert_eq!(object1, object1); 361 assert_ne!(object1, object2); 362 assert_ne!(object2, object3); 363 } 364 } 365