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