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