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_cimod array;
15a1d56debSopenharmony_cimod index;
16a1d56debSopenharmony_cimod number;
17a1d56debSopenharmony_cimod object;
18a1d56debSopenharmony_ci
19a1d56debSopenharmony_cipub use array::Array;
20a1d56debSopenharmony_cipub use index::Index;
21a1d56debSopenharmony_cipub use number::Number;
22a1d56debSopenharmony_cipub use object::Object;
23a1d56debSopenharmony_ci
24a1d56debSopenharmony_ciuse crate::{start_parsing, CompactEncoder, Error, FormattedEncoder};
25a1d56debSopenharmony_ciuse core::fmt::{Debug, Display, Formatter};
26a1d56debSopenharmony_ciuse core::str::FromStr;
27a1d56debSopenharmony_ci#[cfg(feature = "c_adapter")]
28a1d56debSopenharmony_ciuse std::ffi::CString;
29a1d56debSopenharmony_ciuse std::io::{Read, Write};
30a1d56debSopenharmony_ci
31a1d56debSopenharmony_ci#[cfg(feature = "c_adapter")]
32a1d56debSopenharmony_cipub type JsonString = CString;
33a1d56debSopenharmony_ci#[cfg(not(feature = "c_adapter"))]
34a1d56debSopenharmony_cipub type JsonString = String;
35a1d56debSopenharmony_ci
36a1d56debSopenharmony_ciuse crate::deserializer::Deserializer;
37a1d56debSopenharmony_ci#[cfg(not(feature = "c_adapter"))]
38a1d56debSopenharmony_ciuse std::fs::File;
39a1d56debSopenharmony_ci#[cfg(not(feature = "c_adapter"))]
40a1d56debSopenharmony_ciuse std::path::Path;
41a1d56debSopenharmony_ci
42a1d56debSopenharmony_ci/// There are 6 types of values that appear in Json text:
43a1d56debSopenharmony_ci///
44a1d56debSopenharmony_ci/// 1.Null: Null tupe
45a1d56debSopenharmony_ci///
46a1d56debSopenharmony_ci/// 2.Boolean: Boolean type
47a1d56debSopenharmony_ci///
48a1d56debSopenharmony_ci/// 3.Number: Numerical type
49a1d56debSopenharmony_ci///
50a1d56debSopenharmony_ci/// 4.String: String type
51a1d56debSopenharmony_ci///
52a1d56debSopenharmony_ci/// 5.Array: Array type
53a1d56debSopenharmony_ci///
54a1d56debSopenharmony_ci/// 6.Object: Object type
55a1d56debSopenharmony_ci///
56a1d56debSopenharmony_ci/// RFC 7159 3. Values say
57a1d56debSopenharmony_ci/// “A Json value must be an object, an array, a number, a string, or a text string of false, null, or true.”
58a1d56debSopenharmony_ci///
59a1d56debSopenharmony_ci/// # features
60a1d56debSopenharmony_ci/// Uses"c_adatper" feature:
61a1d56debSopenharmony_ci/// In order to adapt the C encapsulation layer interface, the structure changes the
62a1d56debSopenharmony_ci/// underlying implementation of String, and uses CString to get the char* pointer easily.
63a1d56debSopenharmony_ci// TODO: Enhance the encapsulation of JsonValue, makes users can't use enum directly.
64a1d56debSopenharmony_ci#[derive(Clone)]
65a1d56debSopenharmony_cipub enum JsonValue {
66a1d56debSopenharmony_ci    /// Null type
67a1d56debSopenharmony_ci    Null,
68a1d56debSopenharmony_ci
69a1d56debSopenharmony_ci    /// Boolean type
70a1d56debSopenharmony_ci    Boolean(bool),
71a1d56debSopenharmony_ci
72a1d56debSopenharmony_ci    /// Numerical type
73a1d56debSopenharmony_ci    Number(Number),
74a1d56debSopenharmony_ci
75a1d56debSopenharmony_ci    /// String type
76a1d56debSopenharmony_ci    String(JsonString),
77a1d56debSopenharmony_ci
78a1d56debSopenharmony_ci    /// Array type
79a1d56debSopenharmony_ci    Array(Array),
80a1d56debSopenharmony_ci
81a1d56debSopenharmony_ci    /// Object type
82a1d56debSopenharmony_ci    Object(Object),
83a1d56debSopenharmony_ci}
84a1d56debSopenharmony_ci
85a1d56debSopenharmony_ci/// JsonValue print method 1, prints the content directly (without extra double quotes).
86a1d56debSopenharmony_ci///
87a1d56debSopenharmony_ci/// # Examples
88a1d56debSopenharmony_ci/// ```
89a1d56debSopenharmony_ci/// use ylong_json::JsonValue;
90a1d56debSopenharmony_ci///
91a1d56debSopenharmony_ci/// let value: JsonValue = "hello".into();
92a1d56debSopenharmony_ci/// let string = format!("{value}");
93a1d56debSopenharmony_ci/// assert_eq!(string, "\"hello\"");
94a1d56debSopenharmony_ci/// ```
95a1d56debSopenharmony_ciimpl Display for JsonValue {
96a1d56debSopenharmony_ci    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
97a1d56debSopenharmony_ci        match self {
98a1d56debSopenharmony_ci            Self::Null => write!(f, "null"),
99a1d56debSopenharmony_ci            Self::Boolean(b) => write!(f, "{b}"),
100a1d56debSopenharmony_ci            Self::Number(n) => Display::fmt(n, f),
101a1d56debSopenharmony_ci            // The Debug output is the same for CString and String.
102a1d56debSopenharmony_ci            Self::String(s) => write!(f, "{s:?}"),
103a1d56debSopenharmony_ci            Self::Array(a) => Display::fmt(a, f),
104a1d56debSopenharmony_ci            Self::Object(o) => Display::fmt(o, f),
105a1d56debSopenharmony_ci        }
106a1d56debSopenharmony_ci    }
107a1d56debSopenharmony_ci}
108a1d56debSopenharmony_ci
109a1d56debSopenharmony_ciimpl Debug for JsonValue {
110a1d56debSopenharmony_ci    fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
111a1d56debSopenharmony_ci        Display::fmt(self, f)
112a1d56debSopenharmony_ci    }
113a1d56debSopenharmony_ci}
114a1d56debSopenharmony_ci
115a1d56debSopenharmony_ciimpl JsonValue {
116a1d56debSopenharmony_ci    /// Creates an instance of JsonValue for Null type.
117a1d56debSopenharmony_ci    ///
118a1d56debSopenharmony_ci    /// # Examples
119a1d56debSopenharmony_ci    /// ```
120a1d56debSopenharmony_ci    /// use ylong_json::JsonValue;
121a1d56debSopenharmony_ci    ///
122a1d56debSopenharmony_ci    /// let value = JsonValue::new_null();
123a1d56debSopenharmony_ci    /// assert_eq!(value, JsonValue::Null);
124a1d56debSopenharmony_ci    /// ```
125a1d56debSopenharmony_ci    pub fn new_null() -> Self {
126a1d56debSopenharmony_ci        Self::Null
127a1d56debSopenharmony_ci    }
128a1d56debSopenharmony_ci
129a1d56debSopenharmony_ci    /// Creates an instance of JsonValue for Boolean type.
130a1d56debSopenharmony_ci    ///
131a1d56debSopenharmony_ci    /// # Examples
132a1d56debSopenharmony_ci    /// ```
133a1d56debSopenharmony_ci    /// use ylong_json::JsonValue;
134a1d56debSopenharmony_ci    ///
135a1d56debSopenharmony_ci    /// let value = JsonValue::new_boolean(true);
136a1d56debSopenharmony_ci    /// assert_eq!(value, JsonValue::Boolean(true));
137a1d56debSopenharmony_ci    /// ```
138a1d56debSopenharmony_ci    pub fn new_boolean(boolean: bool) -> Self {
139a1d56debSopenharmony_ci        Self::Boolean(boolean)
140a1d56debSopenharmony_ci    }
141a1d56debSopenharmony_ci
142a1d56debSopenharmony_ci    /// Creates an instance of JsonValue for Numerical type.
143a1d56debSopenharmony_ci    ///
144a1d56debSopenharmony_ci    /// # Examples
145a1d56debSopenharmony_ci    /// ```
146a1d56debSopenharmony_ci    /// use ylong_json::JsonValue;
147a1d56debSopenharmony_ci    ///
148a1d56debSopenharmony_ci    /// let value = JsonValue::new_number(0.0.into());
149a1d56debSopenharmony_ci    /// assert_eq!(value, JsonValue::Number(0.0.into()));
150a1d56debSopenharmony_ci    /// ```
151a1d56debSopenharmony_ci    pub fn new_number(number: Number) -> Self {
152a1d56debSopenharmony_ci        Self::Number(number)
153a1d56debSopenharmony_ci    }
154a1d56debSopenharmony_ci
155a1d56debSopenharmony_ci    /// Creates an instance of JsonValue for String type.
156a1d56debSopenharmony_ci    ///
157a1d56debSopenharmony_ci    /// # Examples
158a1d56debSopenharmony_ci    /// ```not run
159a1d56debSopenharmony_ci    /// use ylong_json::JsonValue;
160a1d56debSopenharmony_ci    ///
161a1d56debSopenharmony_ci    /// let value = JsonValue::new_string("Hello World");
162a1d56debSopenharmony_ci    /// // When open "c_adapter" feature, the internal value is String.
163a1d56debSopenharmony_ci    /// assert_eq!(value, JsonValue::String(String::from("Hello World")));
164a1d56debSopenharmony_ci    ///
165a1d56debSopenharmony_ci    /// // When opening "c_adapter" feature, the internal value is CString.
166a1d56debSopenharmony_ci    /// // assert_eq!(value, JsonValue::String(CString::new("Hello World")));
167a1d56debSopenharmony_ci    /// ```
168a1d56debSopenharmony_ci    pub fn new_string(str: &str) -> Self {
169a1d56debSopenharmony_ci        // The underlying implementation of String here is CString.
170a1d56debSopenharmony_ci        #[cfg(feature = "c_adapter")]
171a1d56debSopenharmony_ci        let result = Self::String(JsonString::new(str).unwrap());
172a1d56debSopenharmony_ci
173a1d56debSopenharmony_ci        #[cfg(not(feature = "c_adapter"))]
174a1d56debSopenharmony_ci        let result = Self::String(JsonString::from(str));
175a1d56debSopenharmony_ci
176a1d56debSopenharmony_ci        result
177a1d56debSopenharmony_ci    }
178a1d56debSopenharmony_ci
179a1d56debSopenharmony_ci    /// Creates an instance of JsonValue for Array type.
180a1d56debSopenharmony_ci    ///
181a1d56debSopenharmony_ci    /// # Examples
182a1d56debSopenharmony_ci    /// ```
183a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Array};
184a1d56debSopenharmony_ci    ///
185a1d56debSopenharmony_ci    /// let value = JsonValue::new_array(Array::new());
186a1d56debSopenharmony_ci    /// assert_eq!(value, JsonValue::Array(Array::new()));
187a1d56debSopenharmony_ci    /// ```
188a1d56debSopenharmony_ci    pub fn new_array(array: Array) -> Self {
189a1d56debSopenharmony_ci        Self::Array(array)
190a1d56debSopenharmony_ci    }
191a1d56debSopenharmony_ci
192a1d56debSopenharmony_ci    /// Creates an instance of JsonValue for Object type.
193a1d56debSopenharmony_ci    ///
194a1d56debSopenharmony_ci    /// # Examples
195a1d56debSopenharmony_ci    /// ```
196a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Object};
197a1d56debSopenharmony_ci    ///
198a1d56debSopenharmony_ci    /// let value = JsonValue::new_object(Object::new());
199a1d56debSopenharmony_ci    /// assert_eq!(value, JsonValue::Object(Object::new()));
200a1d56debSopenharmony_ci    /// ```
201a1d56debSopenharmony_ci    pub fn new_object(object: Object) -> Self {
202a1d56debSopenharmony_ci        Self::Object(object)
203a1d56debSopenharmony_ci    }
204a1d56debSopenharmony_ci
205a1d56debSopenharmony_ci    /// Determines whether JsonValue is Null type. Returns true if yes, false if no.
206a1d56debSopenharmony_ci    ///
207a1d56debSopenharmony_ci    /// # Examples
208a1d56debSopenharmony_ci    /// ```
209a1d56debSopenharmony_ci    /// use ylong_json::JsonValue;
210a1d56debSopenharmony_ci    ///
211a1d56debSopenharmony_ci    /// let null_value = JsonValue::new_null();
212a1d56debSopenharmony_ci    /// assert_eq!(null_value.is_null(), true);
213a1d56debSopenharmony_ci    ///
214a1d56debSopenharmony_ci    /// let other_value = JsonValue::new_number(0.0.into());
215a1d56debSopenharmony_ci    /// assert_eq!(other_value.is_null(), false);
216a1d56debSopenharmony_ci    /// ```
217a1d56debSopenharmony_ci    pub fn is_null(&self) -> bool {
218a1d56debSopenharmony_ci        matches!(*self, Self::Null)
219a1d56debSopenharmony_ci    }
220a1d56debSopenharmony_ci
221a1d56debSopenharmony_ci    /// Determines whether JsonValue is Boolean type. Returns true if yes, false if no.
222a1d56debSopenharmony_ci    ///
223a1d56debSopenharmony_ci    /// # Examples
224a1d56debSopenharmony_ci    /// ```
225a1d56debSopenharmony_ci    /// use ylong_json::JsonValue;
226a1d56debSopenharmony_ci    ///
227a1d56debSopenharmony_ci    /// let boolean_value = JsonValue::new_boolean(true);
228a1d56debSopenharmony_ci    /// assert_eq!(boolean_value.is_boolean(), true);
229a1d56debSopenharmony_ci    ///
230a1d56debSopenharmony_ci    /// let other_value = JsonValue::new_null();
231a1d56debSopenharmony_ci    /// assert_eq!(other_value.is_boolean(), false);
232a1d56debSopenharmony_ci    /// ```
233a1d56debSopenharmony_ci    pub fn is_boolean(&self) -> bool {
234a1d56debSopenharmony_ci        matches!(*self, Self::Boolean(_))
235a1d56debSopenharmony_ci    }
236a1d56debSopenharmony_ci
237a1d56debSopenharmony_ci    /// Determines whether JsonValue is true. Returns true if yes, false if no.
238a1d56debSopenharmony_ci    ///
239a1d56debSopenharmony_ci    /// # Examples
240a1d56debSopenharmony_ci    /// ```
241a1d56debSopenharmony_ci    /// use ylong_json::JsonValue;
242a1d56debSopenharmony_ci    ///
243a1d56debSopenharmony_ci    /// let true_value = JsonValue::new_boolean(true);
244a1d56debSopenharmony_ci    /// assert_eq!(true_value.is_true(), true);
245a1d56debSopenharmony_ci    ///
246a1d56debSopenharmony_ci    /// let other_value = JsonValue::new_boolean(false);
247a1d56debSopenharmony_ci    /// assert_eq!(other_value.is_true(), false);
248a1d56debSopenharmony_ci    /// ```
249a1d56debSopenharmony_ci    pub fn is_true(&self) -> bool {
250a1d56debSopenharmony_ci        match *self {
251a1d56debSopenharmony_ci            Self::Boolean(x) => x,
252a1d56debSopenharmony_ci            _ => false,
253a1d56debSopenharmony_ci        }
254a1d56debSopenharmony_ci    }
255a1d56debSopenharmony_ci
256a1d56debSopenharmony_ci    /// Determines whether JsonValue is false. Returns true if yes, false if no.
257a1d56debSopenharmony_ci    ///
258a1d56debSopenharmony_ci    /// # Examples
259a1d56debSopenharmony_ci    /// ```
260a1d56debSopenharmony_ci    /// use ylong_json::JsonValue;
261a1d56debSopenharmony_ci    ///
262a1d56debSopenharmony_ci    /// let false_value = JsonValue::new_boolean(false);
263a1d56debSopenharmony_ci    /// assert_eq!(false_value.is_false(), true);
264a1d56debSopenharmony_ci    ///
265a1d56debSopenharmony_ci    /// let other_value = JsonValue::new_boolean(true);
266a1d56debSopenharmony_ci    /// assert_eq!(other_value.is_false(), false);
267a1d56debSopenharmony_ci    /// ```
268a1d56debSopenharmony_ci    pub fn is_false(&self) -> bool {
269a1d56debSopenharmony_ci        match *self {
270a1d56debSopenharmony_ci            Self::Boolean(x) => !x,
271a1d56debSopenharmony_ci            _ => false,
272a1d56debSopenharmony_ci        }
273a1d56debSopenharmony_ci    }
274a1d56debSopenharmony_ci
275a1d56debSopenharmony_ci    /// Determines whether JsonValue is Numerical type. Returns true if yes, false if no.
276a1d56debSopenharmony_ci    ///
277a1d56debSopenharmony_ci    /// # Examples
278a1d56debSopenharmony_ci    /// ```
279a1d56debSopenharmony_ci    /// use ylong_json::JsonValue;
280a1d56debSopenharmony_ci    ///
281a1d56debSopenharmony_ci    /// let number_value = JsonValue::new_number(0.0.into());
282a1d56debSopenharmony_ci    /// assert_eq!(number_value.is_number(), true);
283a1d56debSopenharmony_ci    ///
284a1d56debSopenharmony_ci    /// let other_value = JsonValue::new_null();
285a1d56debSopenharmony_ci    /// assert_eq!(other_value.is_number(), false);
286a1d56debSopenharmony_ci    /// ```
287a1d56debSopenharmony_ci    pub fn is_number(&self) -> bool {
288a1d56debSopenharmony_ci        matches!(*self, Self::Number(_))
289a1d56debSopenharmony_ci    }
290a1d56debSopenharmony_ci
291a1d56debSopenharmony_ci    /// Determines whether JsonValue is String type. Returns true if yes, false if no.
292a1d56debSopenharmony_ci    ///
293a1d56debSopenharmony_ci    /// # Examples
294a1d56debSopenharmony_ci    /// ```
295a1d56debSopenharmony_ci    /// use ylong_json::JsonValue;
296a1d56debSopenharmony_ci    ///
297a1d56debSopenharmony_ci    /// let string_value = JsonValue::new_string("Hello World");
298a1d56debSopenharmony_ci    /// assert_eq!(string_value.is_string(), true);
299a1d56debSopenharmony_ci    ///
300a1d56debSopenharmony_ci    /// let other_value = JsonValue::new_null();
301a1d56debSopenharmony_ci    /// assert_eq!(other_value.is_string(), false);
302a1d56debSopenharmony_ci    /// ```
303a1d56debSopenharmony_ci    pub fn is_string(&self) -> bool {
304a1d56debSopenharmony_ci        matches!(*self, Self::String(_))
305a1d56debSopenharmony_ci    }
306a1d56debSopenharmony_ci
307a1d56debSopenharmony_ci    /// Determines whether JsonValue is Array type. Returns true if yes, false if no.
308a1d56debSopenharmony_ci    ///
309a1d56debSopenharmony_ci    /// # Examples
310a1d56debSopenharmony_ci    /// ```
311a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Array};
312a1d56debSopenharmony_ci    ///
313a1d56debSopenharmony_ci    /// let array_value = JsonValue::new_array(Array::new());
314a1d56debSopenharmony_ci    /// assert_eq!(array_value.is_array(), true);
315a1d56debSopenharmony_ci    ///
316a1d56debSopenharmony_ci    /// let other_value = JsonValue::new_null();
317a1d56debSopenharmony_ci    /// assert_eq!(other_value.is_array(), false);
318a1d56debSopenharmony_ci    /// ```
319a1d56debSopenharmony_ci    pub fn is_array(&self) -> bool {
320a1d56debSopenharmony_ci        matches!(*self, Self::Array(_))
321a1d56debSopenharmony_ci    }
322a1d56debSopenharmony_ci
323a1d56debSopenharmony_ci    /// Determines whether JsonValue is Object type. Returns true if yes, false if no.
324a1d56debSopenharmony_ci    ///
325a1d56debSopenharmony_ci    /// # Examples
326a1d56debSopenharmony_ci    /// ```
327a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Object};
328a1d56debSopenharmony_ci    ///
329a1d56debSopenharmony_ci    /// let object_value = JsonValue::new_object(Object::new());
330a1d56debSopenharmony_ci    /// assert_eq!(object_value.is_object(), true);
331a1d56debSopenharmony_ci    ///
332a1d56debSopenharmony_ci    /// let other_value = JsonValue::new_null();
333a1d56debSopenharmony_ci    /// assert_eq!(other_value.is_object(), false);
334a1d56debSopenharmony_ci    /// ```
335a1d56debSopenharmony_ci    pub fn is_object(&self) -> bool {
336a1d56debSopenharmony_ci        matches!(*self, Self::Object(_))
337a1d56debSopenharmony_ci    }
338a1d56debSopenharmony_ci
339a1d56debSopenharmony_ci    /// Trys to convert JsonValue to a common reference of Boolean type. Conversion failure will return Error.
340a1d56debSopenharmony_ci    ///
341a1d56debSopenharmony_ci    /// # Examples
342a1d56debSopenharmony_ci    /// ```
343a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Error};
344a1d56debSopenharmony_ci    ///
345a1d56debSopenharmony_ci    /// let boolean_value = JsonValue::new_boolean(true);
346a1d56debSopenharmony_ci    /// assert_eq!(boolean_value.try_as_boolean().unwrap(), &true);
347a1d56debSopenharmony_ci    ///
348a1d56debSopenharmony_ci    /// let other_value = JsonValue::new_null();
349a1d56debSopenharmony_ci    /// assert!(other_value.try_as_boolean().is_err());
350a1d56debSopenharmony_ci    /// ```
351a1d56debSopenharmony_ci    pub fn try_as_boolean(&self) -> Result<&bool, Error> {
352a1d56debSopenharmony_ci        match self {
353a1d56debSopenharmony_ci            Self::Boolean(boolean) => Ok(boolean),
354a1d56debSopenharmony_ci            _ => Err(Error::TypeTransform),
355a1d56debSopenharmony_ci        }
356a1d56debSopenharmony_ci    }
357a1d56debSopenharmony_ci
358a1d56debSopenharmony_ci    /// Trys to convert JsonValue to a common reference of Numerical type. Conversion failure will return Error.
359a1d56debSopenharmony_ci    ///
360a1d56debSopenharmony_ci    /// # Examples
361a1d56debSopenharmony_ci    /// ```
362a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Number, Error};
363a1d56debSopenharmony_ci    ///
364a1d56debSopenharmony_ci    /// let number_value = JsonValue::new_number(0.0.into());
365a1d56debSopenharmony_ci    /// assert_eq!(number_value.try_as_number().unwrap(), &Number::from(0.0));
366a1d56debSopenharmony_ci    ///
367a1d56debSopenharmony_ci    /// let other_value = JsonValue::new_null();
368a1d56debSopenharmony_ci    /// assert!(other_value.try_as_number().is_err());
369a1d56debSopenharmony_ci    /// ```
370a1d56debSopenharmony_ci    pub fn try_as_number(&self) -> Result<&Number, Error> {
371a1d56debSopenharmony_ci        match self {
372a1d56debSopenharmony_ci            Self::Number(number) => Ok(number),
373a1d56debSopenharmony_ci            _ => Err(Error::TypeTransform),
374a1d56debSopenharmony_ci        }
375a1d56debSopenharmony_ci    }
376a1d56debSopenharmony_ci
377a1d56debSopenharmony_ci    /// Trys to convert JsonValue to a common reference of String type. Conversion failure will return Error.
378a1d56debSopenharmony_ci    ///
379a1d56debSopenharmony_ci    /// # Examples
380a1d56debSopenharmony_ci    /// ```no_run
381a1d56debSopenharmony_ci    /// #[cfg(feature = "c_adapter")]
382a1d56debSopenharmony_ci    /// use std::ffi::CString;
383a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Error};
384a1d56debSopenharmony_ci    ///
385a1d56debSopenharmony_ci    /// let string_value = JsonValue::new_string("Hello World");
386a1d56debSopenharmony_ci    /// #[cfg(feature = "c_adapter")]
387a1d56debSopenharmony_ci    /// assert_eq!(string_value.try_as_string().unwrap(), &CString::new("Hello World").unwrap());
388a1d56debSopenharmony_ci    /// #[cfg(not(feature = "c_adapter"))]
389a1d56debSopenharmony_ci    /// assert_eq!(string_value.try_as_string().unwrap(), &String::from("Hello World"));
390a1d56debSopenharmony_ci    /// // When opening "c_adapter" feature, the underlying implementation is CString.
391a1d56debSopenharmony_ci    /// //assert_eq!(string_value.try_as_string().unwrap(), &CString::new("Hello World").unwrap());
392a1d56debSopenharmony_ci    ///
393a1d56debSopenharmony_ci    /// let other_value = JsonValue::new_null();
394a1d56debSopenharmony_ci    /// assert!(other_value.try_as_string().is_err());
395a1d56debSopenharmony_ci    /// ```
396a1d56debSopenharmony_ci    pub fn try_as_string(&self) -> Result<&JsonString, Error> {
397a1d56debSopenharmony_ci        match self {
398a1d56debSopenharmony_ci            Self::String(string) => Ok(string),
399a1d56debSopenharmony_ci            _ => Err(Error::TypeTransform),
400a1d56debSopenharmony_ci        }
401a1d56debSopenharmony_ci    }
402a1d56debSopenharmony_ci
403a1d56debSopenharmony_ci    /// Trys to convert JsonValue to a common reference of Array type. Conversion failure will return Error.
404a1d56debSopenharmony_ci    ///
405a1d56debSopenharmony_ci    /// # Examples
406a1d56debSopenharmony_ci    /// ```
407a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Array, Error};
408a1d56debSopenharmony_ci    ///
409a1d56debSopenharmony_ci    /// let array_value = JsonValue::new_array(Array::new());
410a1d56debSopenharmony_ci    /// assert_eq!(array_value.try_as_array().unwrap(), &Array::new());
411a1d56debSopenharmony_ci    ///
412a1d56debSopenharmony_ci    /// let other_value = JsonValue::new_null();
413a1d56debSopenharmony_ci    /// assert!(other_value.try_as_array().is_err());
414a1d56debSopenharmony_ci    /// ```
415a1d56debSopenharmony_ci    pub fn try_as_array(&self) -> Result<&Array, Error> {
416a1d56debSopenharmony_ci        match self {
417a1d56debSopenharmony_ci            Self::Array(array) => Ok(array),
418a1d56debSopenharmony_ci            _ => Err(Error::TypeTransform),
419a1d56debSopenharmony_ci        }
420a1d56debSopenharmony_ci    }
421a1d56debSopenharmony_ci
422a1d56debSopenharmony_ci    /// Trys to convert JsonValue to a common reference of Object type. Conversion failure will return Error.
423a1d56debSopenharmony_ci    ///
424a1d56debSopenharmony_ci    /// # Examples
425a1d56debSopenharmony_ci    /// ```
426a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Object, Error};
427a1d56debSopenharmony_ci    ///
428a1d56debSopenharmony_ci    /// let array_value = JsonValue::new_object(Object::new());
429a1d56debSopenharmony_ci    /// assert_eq!(array_value.try_as_object().unwrap(), &Object::new());
430a1d56debSopenharmony_ci    ///
431a1d56debSopenharmony_ci    /// let other_value = JsonValue::new_null();
432a1d56debSopenharmony_ci    /// assert!(other_value.try_as_object().is_err());
433a1d56debSopenharmony_ci    /// ```
434a1d56debSopenharmony_ci    pub fn try_as_object(&self) -> Result<&Object, Error> {
435a1d56debSopenharmony_ci        match self {
436a1d56debSopenharmony_ci            Self::Object(object) => Ok(object),
437a1d56debSopenharmony_ci            _ => Err(Error::TypeTransform),
438a1d56debSopenharmony_ci        }
439a1d56debSopenharmony_ci    }
440a1d56debSopenharmony_ci
441a1d56debSopenharmony_ci    /// Trys to convert JsonValue to a mutable reference of Boolean type. Conversion failure will return Error.
442a1d56debSopenharmony_ci    ///
443a1d56debSopenharmony_ci    /// # Examples
444a1d56debSopenharmony_ci    /// ```
445a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Error};
446a1d56debSopenharmony_ci    ///
447a1d56debSopenharmony_ci    /// let mut boolean_value = JsonValue::new_boolean(true);
448a1d56debSopenharmony_ci    /// assert_eq!(boolean_value.try_as_mut_boolean().unwrap(), &mut true);
449a1d56debSopenharmony_ci    ///
450a1d56debSopenharmony_ci    /// let mut other_value = JsonValue::new_null();
451a1d56debSopenharmony_ci    /// assert!(other_value.try_as_mut_boolean().is_err());
452a1d56debSopenharmony_ci    /// ```
453a1d56debSopenharmony_ci    pub fn try_as_mut_boolean(&mut self) -> Result<&mut bool, Error> {
454a1d56debSopenharmony_ci        match self {
455a1d56debSopenharmony_ci            Self::Boolean(boolean) => Ok(boolean),
456a1d56debSopenharmony_ci            _ => Err(Error::TypeTransform),
457a1d56debSopenharmony_ci        }
458a1d56debSopenharmony_ci    }
459a1d56debSopenharmony_ci
460a1d56debSopenharmony_ci    /// Trys to convert JsonValue to a mutable reference of Numerical type. Conversion failure will return Error.
461a1d56debSopenharmony_ci    ///
462a1d56debSopenharmony_ci    /// # Examples
463a1d56debSopenharmony_ci    /// ```
464a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Number, Error};
465a1d56debSopenharmony_ci    ///
466a1d56debSopenharmony_ci    /// let mut number_value = JsonValue::new_number(0.0.into());
467a1d56debSopenharmony_ci    /// assert_eq!(number_value.try_as_mut_number().unwrap(), &mut Number::from(0.0));
468a1d56debSopenharmony_ci    ///
469a1d56debSopenharmony_ci    /// let mut other_value = JsonValue::new_null();
470a1d56debSopenharmony_ci    /// assert!(other_value.try_as_mut_number().is_err());
471a1d56debSopenharmony_ci    /// ```
472a1d56debSopenharmony_ci    pub fn try_as_mut_number(&mut self) -> Result<&mut Number, Error> {
473a1d56debSopenharmony_ci        match self {
474a1d56debSopenharmony_ci            Self::Number(number) => Ok(number),
475a1d56debSopenharmony_ci            _ => Err(Error::TypeTransform),
476a1d56debSopenharmony_ci        }
477a1d56debSopenharmony_ci    }
478a1d56debSopenharmony_ci
479a1d56debSopenharmony_ci    /// Trys to convert JsonValue to a mutable reference of String type. Conversion failure will return Error.
480a1d56debSopenharmony_ci    ///
481a1d56debSopenharmony_ci    /// # Examples
482a1d56debSopenharmony_ci    /// ```no_run
483a1d56debSopenharmony_ci    /// #[cfg(feature = "c_adapter")]
484a1d56debSopenharmony_ci    /// use std::ffi::CString;
485a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Error};
486a1d56debSopenharmony_ci    ///
487a1d56debSopenharmony_ci    /// let mut string_value = JsonValue::new_string("Hello World");
488a1d56debSopenharmony_ci    /// #[cfg(feature = "c_adapter")]
489a1d56debSopenharmony_ci    /// assert_eq!(string_value.try_as_mut_string().unwrap(), &mut CString::new("Hello World").unwrap());
490a1d56debSopenharmony_ci    /// #[cfg(not(feature = "c_adapter"))]
491a1d56debSopenharmony_ci    /// assert_eq!(string_value.try_as_mut_string().unwrap(), &mut String::from("Hello World"));
492a1d56debSopenharmony_ci    /// // When opening "c_adapter" feature, the underlying implementation is CString.
493a1d56debSopenharmony_ci    /// //assert_eq!(string_value.try_as_mut_string().unwrap(), &mut CString::new("Hello World").unwrap());
494a1d56debSopenharmony_ci    ///
495a1d56debSopenharmony_ci    /// let mut other_value = JsonValue::new_null();
496a1d56debSopenharmony_ci    /// assert!(other_value.try_as_mut_string().is_err());
497a1d56debSopenharmony_ci    /// ```
498a1d56debSopenharmony_ci    pub fn try_as_mut_string(&mut self) -> Result<&mut JsonString, Error> {
499a1d56debSopenharmony_ci        match self {
500a1d56debSopenharmony_ci            Self::String(string) => Ok(string),
501a1d56debSopenharmony_ci            _ => Err(Error::TypeTransform),
502a1d56debSopenharmony_ci        }
503a1d56debSopenharmony_ci    }
504a1d56debSopenharmony_ci
505a1d56debSopenharmony_ci    /// Trys to convert JsonValue to a mutable reference of Array type. Conversion failure will return Error.
506a1d56debSopenharmony_ci    ///
507a1d56debSopenharmony_ci    /// # Examples
508a1d56debSopenharmony_ci    /// ```
509a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Error, Array};
510a1d56debSopenharmony_ci    ///
511a1d56debSopenharmony_ci    /// let mut array_value = JsonValue::new_array(Array::new());
512a1d56debSopenharmony_ci    /// assert_eq!(array_value.try_as_mut_array().unwrap(), &mut Array::new());
513a1d56debSopenharmony_ci    ///
514a1d56debSopenharmony_ci    /// let mut other_value = JsonValue::new_null();
515a1d56debSopenharmony_ci    /// assert!(other_value.try_as_mut_array().is_err());
516a1d56debSopenharmony_ci    /// ```
517a1d56debSopenharmony_ci    pub fn try_as_mut_array(&mut self) -> Result<&mut Array, Error> {
518a1d56debSopenharmony_ci        match self {
519a1d56debSopenharmony_ci            Self::Array(array) => Ok(array),
520a1d56debSopenharmony_ci            _ => Err(Error::TypeTransform),
521a1d56debSopenharmony_ci        }
522a1d56debSopenharmony_ci    }
523a1d56debSopenharmony_ci
524a1d56debSopenharmony_ci    /// Trys to convert JsonValue to a mutable reference of Object type. Conversion failure will return Error.
525a1d56debSopenharmony_ci    ///
526a1d56debSopenharmony_ci    /// # Examples
527a1d56debSopenharmony_ci    /// ```
528a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Error, Object};
529a1d56debSopenharmony_ci    ///
530a1d56debSopenharmony_ci    /// let mut object_value = JsonValue::new_object(Object::new());
531a1d56debSopenharmony_ci    /// assert_eq!(object_value.try_as_mut_object().unwrap(), &mut Object::new());
532a1d56debSopenharmony_ci    ///
533a1d56debSopenharmony_ci    /// let mut other_value = JsonValue::new_null();
534a1d56debSopenharmony_ci    /// assert!(other_value.try_as_mut_object().is_err());
535a1d56debSopenharmony_ci    /// ```
536a1d56debSopenharmony_ci    pub fn try_as_mut_object(&mut self) -> Result<&mut Object, Error> {
537a1d56debSopenharmony_ci        match self {
538a1d56debSopenharmony_ci            Self::Object(object) => Ok(object),
539a1d56debSopenharmony_ci            _ => Err(Error::TypeTransform),
540a1d56debSopenharmony_ci        }
541a1d56debSopenharmony_ci    }
542a1d56debSopenharmony_ci
543a1d56debSopenharmony_ci    /// Trys to convert JsonValue to Boolean type. This method transfers ownership.
544a1d56debSopenharmony_ci    /// Conversion failure will return Error.
545a1d56debSopenharmony_ci    ///
546a1d56debSopenharmony_ci    /// # Examples
547a1d56debSopenharmony_ci    /// ```
548a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Error};
549a1d56debSopenharmony_ci    ///
550a1d56debSopenharmony_ci    /// let boolean_value = JsonValue::new_boolean(true);
551a1d56debSopenharmony_ci    /// assert_eq!(boolean_value.try_into_boolean().unwrap(), true);
552a1d56debSopenharmony_ci    ///
553a1d56debSopenharmony_ci    /// let other_value = JsonValue::new_null();
554a1d56debSopenharmony_ci    /// assert!(other_value.try_into_boolean().is_err());
555a1d56debSopenharmony_ci    /// ```
556a1d56debSopenharmony_ci    pub fn try_into_boolean(self) -> Result<bool, Error> {
557a1d56debSopenharmony_ci        match self {
558a1d56debSopenharmony_ci            Self::Boolean(boolean) => Ok(boolean),
559a1d56debSopenharmony_ci            _ => Err(Error::TypeTransform),
560a1d56debSopenharmony_ci        }
561a1d56debSopenharmony_ci    }
562a1d56debSopenharmony_ci
563a1d56debSopenharmony_ci    /// Trys to convert JsonValue to Numerical type. This method transfers ownership.
564a1d56debSopenharmony_ci    /// Conversion failure will return Error.
565a1d56debSopenharmony_ci    ///
566a1d56debSopenharmony_ci    /// The value will be output as f64. If you want to output other types, use 'as' to convert.
567a1d56debSopenharmony_ci    ///
568a1d56debSopenharmony_ci    /// # Examples
569a1d56debSopenharmony_ci    /// ```
570a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Number, Error};
571a1d56debSopenharmony_ci    ///
572a1d56debSopenharmony_ci    /// let number_value = JsonValue::new_number(0.0.into());
573a1d56debSopenharmony_ci    /// assert_eq!(number_value.try_into_number().unwrap(), Number::from(0.0));
574a1d56debSopenharmony_ci    ///
575a1d56debSopenharmony_ci    /// let other_value = JsonValue::new_null();
576a1d56debSopenharmony_ci    /// assert!(other_value.try_into_number().is_err());
577a1d56debSopenharmony_ci    /// ```
578a1d56debSopenharmony_ci    pub fn try_into_number(self) -> Result<Number, Error> {
579a1d56debSopenharmony_ci        match self {
580a1d56debSopenharmony_ci            Self::Number(number) => Ok(number),
581a1d56debSopenharmony_ci            _ => Err(Error::TypeTransform),
582a1d56debSopenharmony_ci        }
583a1d56debSopenharmony_ci    }
584a1d56debSopenharmony_ci
585a1d56debSopenharmony_ci    /// Trys to convert JsonValue to String type. This method transfers ownership.
586a1d56debSopenharmony_ci    /// Conversion failure will return Error.
587a1d56debSopenharmony_ci    ///
588a1d56debSopenharmony_ci    /// # Examples
589a1d56debSopenharmony_ci    /// ```no_run
590a1d56debSopenharmony_ci    /// #[cfg(feature = "c_adapter")]
591a1d56debSopenharmony_ci    /// use std::ffi::CString;
592a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Error};
593a1d56debSopenharmony_ci    ///
594a1d56debSopenharmony_ci    /// let string_value = JsonValue::new_string("Hello World");
595a1d56debSopenharmony_ci    /// #[cfg(feature = "c_adapter")]
596a1d56debSopenharmony_ci    /// assert_eq!(string_value.try_into_string().unwrap(), CString::new("Hello World").unwrap());
597a1d56debSopenharmony_ci    /// #[cfg(not(feature = "c_adapter"))]
598a1d56debSopenharmony_ci    /// assert_eq!(string_value.try_into_string().unwrap(), String::from("Hello World"));
599a1d56debSopenharmony_ci    /// // When opening "c_adapter" feature, the underlying implementation is CString.
600a1d56debSopenharmony_ci    /// //assert_eq!(string_value.try_into_string().unwrap(), CString::new("Hello World").unwrap());
601a1d56debSopenharmony_ci    ///
602a1d56debSopenharmony_ci    /// let other_value = JsonValue::new_null();
603a1d56debSopenharmony_ci    /// assert!(other_value.try_into_string().is_err());
604a1d56debSopenharmony_ci    /// ```
605a1d56debSopenharmony_ci    pub fn try_into_string(self) -> Result<JsonString, Error> {
606a1d56debSopenharmony_ci        match self {
607a1d56debSopenharmony_ci            Self::String(string) => Ok(string),
608a1d56debSopenharmony_ci            _ => Err(Error::TypeTransform),
609a1d56debSopenharmony_ci        }
610a1d56debSopenharmony_ci    }
611a1d56debSopenharmony_ci
612a1d56debSopenharmony_ci    /// Trys to convert JsonValue to Array type. This method transfers ownership.
613a1d56debSopenharmony_ci    /// Conversion failure will return Error.
614a1d56debSopenharmony_ci    ///
615a1d56debSopenharmony_ci    /// # Examples
616a1d56debSopenharmony_ci    /// ```
617a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Error, Array};
618a1d56debSopenharmony_ci    ///
619a1d56debSopenharmony_ci    /// let array_value = JsonValue::new_array(Array::new());
620a1d56debSopenharmony_ci    /// assert_eq!(array_value.try_into_array().unwrap(), Array::new());
621a1d56debSopenharmony_ci    ///
622a1d56debSopenharmony_ci    /// let other_value = JsonValue::new_null();
623a1d56debSopenharmony_ci    /// assert!(other_value.try_into_array().is_err());
624a1d56debSopenharmony_ci    /// ```
625a1d56debSopenharmony_ci    pub fn try_into_array(self) -> Result<Array, Error> {
626a1d56debSopenharmony_ci        match self {
627a1d56debSopenharmony_ci            Self::Array(array) => Ok(array),
628a1d56debSopenharmony_ci            _ => Err(Error::TypeTransform),
629a1d56debSopenharmony_ci        }
630a1d56debSopenharmony_ci    }
631a1d56debSopenharmony_ci
632a1d56debSopenharmony_ci    /// Trys to convert JsonValue to Object type. This method transfers ownership.
633a1d56debSopenharmony_ci    /// Conversion failure will return Error.
634a1d56debSopenharmony_ci    ///
635a1d56debSopenharmony_ci    /// # Examples
636a1d56debSopenharmony_ci    /// ```
637a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Error, Object};
638a1d56debSopenharmony_ci    ///
639a1d56debSopenharmony_ci    /// let object_value = JsonValue::new_object(Object::new());
640a1d56debSopenharmony_ci    /// assert_eq!(object_value.try_into_object().unwrap(), Object::new());
641a1d56debSopenharmony_ci    ///
642a1d56debSopenharmony_ci    /// let other_value = JsonValue::new_null();
643a1d56debSopenharmony_ci    /// assert!(other_value.try_into_object().is_err());
644a1d56debSopenharmony_ci    /// ```
645a1d56debSopenharmony_ci    pub fn try_into_object(self) -> Result<Object, Error> {
646a1d56debSopenharmony_ci        match self {
647a1d56debSopenharmony_ci            Self::Object(object) => Ok(object),
648a1d56debSopenharmony_ci            _ => Err(Error::TypeTransform),
649a1d56debSopenharmony_ci        }
650a1d56debSopenharmony_ci    }
651a1d56debSopenharmony_ci
652a1d56debSopenharmony_ci    /// Trys to remove a member form an Object or Array. If the member is found by Index,
653a1d56debSopenharmony_ci    /// gets value of the member from the Object or Array.
654a1d56debSopenharmony_ci    ///
655a1d56debSopenharmony_ci    /// # Examples
656a1d56debSopenharmony_ci    /// ```
657a1d56debSopenharmony_ci    /// use ylong_json::{Object, JsonValue};
658a1d56debSopenharmony_ci    ///
659a1d56debSopenharmony_ci    /// let mut object = Object::new();
660a1d56debSopenharmony_ci    /// object.insert(String::from("key"), "value".into());
661a1d56debSopenharmony_ci    ///
662a1d56debSopenharmony_ci    /// let mut value: JsonValue = object.into();
663a1d56debSopenharmony_ci    /// assert_eq!(value["key"], "value".into());
664a1d56debSopenharmony_ci    ///
665a1d56debSopenharmony_ci    /// value.remove("key");
666a1d56debSopenharmony_ci    /// assert_eq!(value["key"], JsonValue::Null);
667a1d56debSopenharmony_ci    /// ```
668a1d56debSopenharmony_ci    pub fn remove<I: index::Index>(&mut self, index: I) -> Option<JsonValue> {
669a1d56debSopenharmony_ci        index.index_remove(self)
670a1d56debSopenharmony_ci    }
671a1d56debSopenharmony_ci
672a1d56debSopenharmony_ci    /// Reads the contents from the file and Trys to deserialize to a JsonValue instance.
673a1d56debSopenharmony_ci    ///
674a1d56debSopenharmony_ci    /// # Examples
675a1d56debSopenharmony_ci    /// ```not run
676a1d56debSopenharmony_ci    /// use ylong_json::JsonValue;
677a1d56debSopenharmony_ci    ///
678a1d56debSopenharmony_ci    /// let value = JsonValue::from_file("./json.txt").unwrap();
679a1d56debSopenharmony_ci    /// ```
680a1d56debSopenharmony_ci    #[cfg(not(feature = "c_adapter"))]
681a1d56debSopenharmony_ci    pub fn from_file<P: AsRef<Path>>(path: P) -> Result<Self, Error> {
682a1d56debSopenharmony_ci        let mut file = File::open(path.as_ref())?;
683a1d56debSopenharmony_ci        Self::from_reader(&mut file)
684a1d56debSopenharmony_ci    }
685a1d56debSopenharmony_ci
686a1d56debSopenharmony_ci    /// Gets the text from an object that implements the Read trait provided
687a1d56debSopenharmony_ci    /// by the standard library and Trys to deserialize it into a JsonValue instance.
688a1d56debSopenharmony_ci    ///
689a1d56debSopenharmony_ci    /// # Examples
690a1d56debSopenharmony_ci    /// ```not run
691a1d56debSopenharmony_ci    /// use ylong_json::JsonValue;
692a1d56debSopenharmony_ci    /// use std::fs::File;
693a1d56debSopenharmony_ci    ///
694a1d56debSopenharmony_ci    /// let mut file = File::open("./json.txt").unwrap();
695a1d56debSopenharmony_ci    /// let value = JsonValue::from_reader(&mut file).unwrap();
696a1d56debSopenharmony_ci    /// ```
697a1d56debSopenharmony_ci    pub fn from_reader<R: Read>(input: R) -> Result<Self, Error> {
698a1d56debSopenharmony_ci        let mut deserializer = Deserializer::new_from_io(input);
699a1d56debSopenharmony_ci        start_parsing(&mut deserializer)
700a1d56debSopenharmony_ci    }
701a1d56debSopenharmony_ci
702a1d56debSopenharmony_ci    /// Reads the text from a type that can be converted to [u8] and Trys to deserialize it to a Json instance.
703a1d56debSopenharmony_ci    ///
704a1d56debSopenharmony_ci    /// # Examples
705a1d56debSopenharmony_ci    /// ```
706a1d56debSopenharmony_ci    /// use ylong_json::JsonValue;
707a1d56debSopenharmony_ci    ///
708a1d56debSopenharmony_ci    /// let text = r#"
709a1d56debSopenharmony_ci    /// {
710a1d56debSopenharmony_ci    ///     "key": "value"
711a1d56debSopenharmony_ci    /// }
712a1d56debSopenharmony_ci    /// "#;
713a1d56debSopenharmony_ci    /// let value = JsonValue::from_text(text.as_bytes()).unwrap();
714a1d56debSopenharmony_ci    ///
715a1d56debSopenharmony_ci    /// assert_eq!(value["key"], "value".into());
716a1d56debSopenharmony_ci    /// ```
717a1d56debSopenharmony_ci    pub fn from_text<T: AsRef<[u8]>>(text: T) -> Result<Self, Error> {
718a1d56debSopenharmony_ci        let mut deserializer = Deserializer::new_from_slice(text.as_ref());
719a1d56debSopenharmony_ci        start_parsing(&mut deserializer)
720a1d56debSopenharmony_ci    }
721a1d56debSopenharmony_ci
722a1d56debSopenharmony_ci    /// Serializes the JsonValue instance to a formatted string with additional whitespace characters.
723a1d56debSopenharmony_ci    ///
724a1d56debSopenharmony_ci    /// # Examples
725a1d56debSopenharmony_ci    /// ```
726a1d56debSopenharmony_ci    /// use ylong_json::JsonValue;
727a1d56debSopenharmony_ci    ///
728a1d56debSopenharmony_ci    /// let text = r#"{
729a1d56debSopenharmony_ci    ///     "key": "value"
730a1d56debSopenharmony_ci    /// }
731a1d56debSopenharmony_ci    /// "#;
732a1d56debSopenharmony_ci    /// let value = JsonValue::from_text(text.as_bytes()).unwrap();
733a1d56debSopenharmony_ci    /// let string = value.to_formatted_string().unwrap();
734a1d56debSopenharmony_ci    /// assert_eq!(string, text);
735a1d56debSopenharmony_ci    /// ```
736a1d56debSopenharmony_ci    pub fn to_formatted_string(&self) -> Result<std::string::String, Error> {
737a1d56debSopenharmony_ci        let mut vec = Vec::new();
738a1d56debSopenharmony_ci        self.formatted_encode(&mut vec)?;
739a1d56debSopenharmony_ci        Ok(unsafe { std::string::String::from_utf8_unchecked(vec) })
740a1d56debSopenharmony_ci    }
741a1d56debSopenharmony_ci
742a1d56debSopenharmony_ci    /// Serializes the JsonValue instance to a one-line string with no additional whitespace.
743a1d56debSopenharmony_ci    ///
744a1d56debSopenharmony_ci    /// # Examples
745a1d56debSopenharmony_ci    /// ```
746a1d56debSopenharmony_ci    /// use ylong_json::JsonValue;
747a1d56debSopenharmony_ci    ///
748a1d56debSopenharmony_ci    /// let text = r#"{"key":"value"}"#;
749a1d56debSopenharmony_ci    /// let value = JsonValue::from_text(text.as_bytes()).unwrap();
750a1d56debSopenharmony_ci    /// let string = value.to_compact_string().unwrap();
751a1d56debSopenharmony_ci    /// assert_eq!(string, text);
752a1d56debSopenharmony_ci    /// ```
753a1d56debSopenharmony_ci    pub fn to_compact_string(&self) -> Result<std::string::String, Error> {
754a1d56debSopenharmony_ci        let mut vec = Vec::new();
755a1d56debSopenharmony_ci        self.compact_encode(&mut vec)?;
756a1d56debSopenharmony_ci        Ok(unsafe { std::string::String::from_utf8_unchecked(vec) })
757a1d56debSopenharmony_ci    }
758a1d56debSopenharmony_ci
759a1d56debSopenharmony_ci    /// Serializes the JsonValue instance to a formatted string with additional whitespace characters.
760a1d56debSopenharmony_ci    /// And outputs to the specified location as a stream of bytes.
761a1d56debSopenharmony_ci    ///
762a1d56debSopenharmony_ci    /// # Examples
763a1d56debSopenharmony_ci    /// ```
764a1d56debSopenharmony_ci    /// use ylong_json::JsonValue;
765a1d56debSopenharmony_ci    ///
766a1d56debSopenharmony_ci    /// let text = r#"{
767a1d56debSopenharmony_ci    ///     "key": "value"
768a1d56debSopenharmony_ci    /// }
769a1d56debSopenharmony_ci    /// "#;
770a1d56debSopenharmony_ci    /// let value = JsonValue::from_text(text.as_bytes()).unwrap();
771a1d56debSopenharmony_ci    /// let mut vec = Vec::new();
772a1d56debSopenharmony_ci    /// value.formatted_encode(&mut vec).unwrap();
773a1d56debSopenharmony_ci    /// assert_eq!(vec, text.as_bytes());
774a1d56debSopenharmony_ci    /// ```
775a1d56debSopenharmony_ci    pub fn formatted_encode<W: Write>(&self, output: &mut W) -> Result<(), Error> {
776a1d56debSopenharmony_ci        let mut encoder = FormattedEncoder::new(output);
777a1d56debSopenharmony_ci        encoder.encode(self)
778a1d56debSopenharmony_ci    }
779a1d56debSopenharmony_ci
780a1d56debSopenharmony_ci    /// Serializes the JsonValue instance to a one-line string with no additional whitespace.
781a1d56debSopenharmony_ci    /// And outputs to the specified location as a stream of bytes.
782a1d56debSopenharmony_ci    ///
783a1d56debSopenharmony_ci    /// # Examples
784a1d56debSopenharmony_ci    /// ```
785a1d56debSopenharmony_ci    /// use ylong_json::JsonValue;
786a1d56debSopenharmony_ci    ///
787a1d56debSopenharmony_ci    /// let text = r#"{"key":"value"}"#;
788a1d56debSopenharmony_ci    /// let value = JsonValue::from_text(text.as_bytes()).unwrap();
789a1d56debSopenharmony_ci    /// let mut vec = Vec::new();
790a1d56debSopenharmony_ci    /// value.compact_encode(&mut vec).unwrap();
791a1d56debSopenharmony_ci    /// assert_eq!(vec, text.as_bytes());
792a1d56debSopenharmony_ci    /// ```
793a1d56debSopenharmony_ci    pub fn compact_encode<W: Write>(&self, output: &mut W) -> Result<(), Error> {
794a1d56debSopenharmony_ci        let mut encoder = CompactEncoder::new(output);
795a1d56debSopenharmony_ci        encoder.encode(self)
796a1d56debSopenharmony_ci    }
797a1d56debSopenharmony_ci}
798a1d56debSopenharmony_ci
799a1d56debSopenharmony_ciimpl FromStr for JsonValue {
800a1d56debSopenharmony_ci    type Err = Error;
801a1d56debSopenharmony_ci
802a1d56debSopenharmony_ci    /// Generates an instance of JsonValue from &str.
803a1d56debSopenharmony_ci    ///
804a1d56debSopenharmony_ci    /// # Examples
805a1d56debSopenharmony_ci    /// ```
806a1d56debSopenharmony_ci    /// use core::str::FromStr;
807a1d56debSopenharmony_ci    /// use ylong_json::JsonValue;
808a1d56debSopenharmony_ci    ///
809a1d56debSopenharmony_ci    /// let text = r#"
810a1d56debSopenharmony_ci    /// {
811a1d56debSopenharmony_ci    ///     "key": "value"
812a1d56debSopenharmony_ci    /// }
813a1d56debSopenharmony_ci    /// "#;
814a1d56debSopenharmony_ci    /// let value = JsonValue::from_str(text).unwrap();
815a1d56debSopenharmony_ci    ///
816a1d56debSopenharmony_ci    /// assert_eq!(value["key"], "value".into());
817a1d56debSopenharmony_ci    /// ```
818a1d56debSopenharmony_ci    fn from_str(s: &str) -> Result<Self, Self::Err> {
819a1d56debSopenharmony_ci        Self::from_text(s)
820a1d56debSopenharmony_ci    }
821a1d56debSopenharmony_ci}
822a1d56debSopenharmony_ci
823a1d56debSopenharmony_ciimpl PartialEq for JsonValue {
824a1d56debSopenharmony_ci    /// Determines whether two Jsonvalues are equal.
825a1d56debSopenharmony_ci    /// Only the same type can be compared; different types simply return false.
826a1d56debSopenharmony_ci    ///
827a1d56debSopenharmony_ci    /// If types are the same, false is returned only if the internal variables are exactly equal.
828a1d56debSopenharmony_ci    /// For example, when comparing arrays, two Arrays are considered equal
829a1d56debSopenharmony_ci    /// only if all their JsonValues have the same position and value.
830a1d56debSopenharmony_ci    /// When comparing objects, two Objects are considered equal
831a1d56debSopenharmony_ci    /// only if all of their key/value pairs match one another.
832a1d56debSopenharmony_ci    ///
833a1d56debSopenharmony_ci    /// # Examples
834a1d56debSopenharmony_ci    /// ```
835a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Array, Object};
836a1d56debSopenharmony_ci    ///
837a1d56debSopenharmony_ci    /// assert_eq!(JsonValue::new_null(), JsonValue::new_null());
838a1d56debSopenharmony_ci    /// assert_eq!(JsonValue::new_boolean(true), JsonValue::new_boolean(true));
839a1d56debSopenharmony_ci    /// assert_eq!(JsonValue::new_number(0.0.into()), JsonValue::new_number(0.0.into()));
840a1d56debSopenharmony_ci    /// assert_eq!(JsonValue::new_string(""), JsonValue::new_string(""));
841a1d56debSopenharmony_ci    /// assert_eq!(JsonValue::new_array(Array::new()), JsonValue::new_array(Array::new()));
842a1d56debSopenharmony_ci    /// assert_eq!(JsonValue::new_object(Object::new()), JsonValue::new_object(Object::new()));
843a1d56debSopenharmony_ci    ///
844a1d56debSopenharmony_ci    /// assert_ne!(JsonValue::new_null(), JsonValue::new_number(0.0.into()));
845a1d56debSopenharmony_ci    /// assert_ne!(JsonValue::new_boolean(true), JsonValue::new_boolean(false));
846a1d56debSopenharmony_ci    ///
847a1d56debSopenharmony_ci    /// let mut array1 = Array::new();
848a1d56debSopenharmony_ci    /// array1.push(JsonValue::new_null());
849a1d56debSopenharmony_ci    ///
850a1d56debSopenharmony_ci    /// let mut array2 = Array::new();
851a1d56debSopenharmony_ci    /// array2.push(JsonValue::new_number(0.0.into()));
852a1d56debSopenharmony_ci    /// assert_ne!(JsonValue::new_array(array1), JsonValue::new_array(array2));
853a1d56debSopenharmony_ci    ///
854a1d56debSopenharmony_ci    /// let mut object1 = Object::new();
855a1d56debSopenharmony_ci    /// object1.insert(String::from("Key"), JsonValue::new_null());
856a1d56debSopenharmony_ci    ///
857a1d56debSopenharmony_ci    /// let mut object2 = Object::new();
858a1d56debSopenharmony_ci    /// object2.insert(String::from("Key"), JsonValue::new_number(0.0.into()));
859a1d56debSopenharmony_ci    /// assert_ne!(JsonValue::new_object(object1), JsonValue::new_object(object2));
860a1d56debSopenharmony_ci    /// ```
861a1d56debSopenharmony_ci    fn eq(&self, other: &Self) -> bool {
862a1d56debSopenharmony_ci        match (self, other) {
863a1d56debSopenharmony_ci            (JsonValue::Null, JsonValue::Null) => true,
864a1d56debSopenharmony_ci            (JsonValue::Boolean(a), JsonValue::Boolean(b)) => a == b,
865a1d56debSopenharmony_ci            (JsonValue::Number(a), JsonValue::Number(b)) => a == b,
866a1d56debSopenharmony_ci            (JsonValue::String(a), JsonValue::String(b)) => a == b,
867a1d56debSopenharmony_ci            (JsonValue::Array(a), JsonValue::Array(b)) => a == b,
868a1d56debSopenharmony_ci            (JsonValue::Object(a), JsonValue::Object(b)) => a == b,
869a1d56debSopenharmony_ci            _ => false,
870a1d56debSopenharmony_ci        }
871a1d56debSopenharmony_ci    }
872a1d56debSopenharmony_ci}
873a1d56debSopenharmony_ci
874a1d56debSopenharmony_ciimpl<I: index::Index> core::ops::Index<I> for JsonValue {
875a1d56debSopenharmony_ci    type Output = JsonValue;
876a1d56debSopenharmony_ci
877a1d56debSopenharmony_ci    fn index(&self, index: I) -> &Self::Output {
878a1d56debSopenharmony_ci        index.index_into(self)
879a1d56debSopenharmony_ci    }
880a1d56debSopenharmony_ci}
881a1d56debSopenharmony_ci
882a1d56debSopenharmony_ciimpl<I: index::Index> core::ops::IndexMut<I> for JsonValue {
883a1d56debSopenharmony_ci    fn index_mut(&mut self, index: I) -> &mut Self::Output {
884a1d56debSopenharmony_ci        index.index_into_mut(self)
885a1d56debSopenharmony_ci    }
886a1d56debSopenharmony_ci}
887a1d56debSopenharmony_ci
888a1d56debSopenharmony_ciimpl From<&str> for JsonValue {
889a1d56debSopenharmony_ci    /// Converts from &str to JsonValue.
890a1d56debSopenharmony_ci    ///
891a1d56debSopenharmony_ci    /// # Examples
892a1d56debSopenharmony_ci    /// ```
893a1d56debSopenharmony_ci    /// use ylong_json::JsonValue;
894a1d56debSopenharmony_ci    ///
895a1d56debSopenharmony_ci    /// let value: JsonValue = "Hello World".into();
896a1d56debSopenharmony_ci    /// ```
897a1d56debSopenharmony_ci    fn from(t: &str) -> Self {
898a1d56debSopenharmony_ci        #[cfg(feature = "c_adapter")]
899a1d56debSopenharmony_ci        let result = Self::String(JsonString::new(t).unwrap());
900a1d56debSopenharmony_ci
901a1d56debSopenharmony_ci        #[cfg(not(feature = "c_adapter"))]
902a1d56debSopenharmony_ci        let result = Self::String(String::from(t));
903a1d56debSopenharmony_ci        result
904a1d56debSopenharmony_ci    }
905a1d56debSopenharmony_ci}
906a1d56debSopenharmony_ci
907a1d56debSopenharmony_ciimpl From<JsonString> for JsonValue {
908a1d56debSopenharmony_ci    /// Converts from String to JsonValue.
909a1d56debSopenharmony_ci    ///
910a1d56debSopenharmony_ci    /// # Examples
911a1d56debSopenharmony_ci    /// ```not run
912a1d56debSopenharmony_ci    /// use ylong_json::JsonValue;
913a1d56debSopenharmony_ci    ///
914a1d56debSopenharmony_ci    /// // Unused "c_adapter" feature.
915a1d56debSopenharmony_ci    /// let value: JsonValue = String::from("Hello World").into();
916a1d56debSopenharmony_ci    /// // Uses "c_adapter" feature.
917a1d56debSopenharmony_ci    /// // let value: JsonValue = CString::new("Hello World").into();
918a1d56debSopenharmony_ci    /// ```
919a1d56debSopenharmony_ci    fn from(t: JsonString) -> Self {
920a1d56debSopenharmony_ci        Self::String(t)
921a1d56debSopenharmony_ci    }
922a1d56debSopenharmony_ci}
923a1d56debSopenharmony_ci
924a1d56debSopenharmony_cimacro_rules! json_value_from_type {
925a1d56debSopenharmony_ci    ($type: tt, $func: expr) => {
926a1d56debSopenharmony_ci        impl From<$type> for JsonValue {
927a1d56debSopenharmony_ci            #[doc = concat!("从 ", stringify!($type), " 转换为 JsonValue。")]
928a1d56debSopenharmony_ci            ///
929a1d56debSopenharmony_ci            /// # Examples
930a1d56debSopenharmony_ci            /// ```
931a1d56debSopenharmony_ci            /// use ylong_json::*;
932a1d56debSopenharmony_ci            ///
933a1d56debSopenharmony_ci            #[doc = concat!("let value: JsonValue = ", stringify!($type), "::default().into();")]
934a1d56debSopenharmony_ci            /// ```
935a1d56debSopenharmony_ci            fn from(t: $type) -> Self {
936a1d56debSopenharmony_ci                $func(t.into())
937a1d56debSopenharmony_ci            }
938a1d56debSopenharmony_ci        }
939a1d56debSopenharmony_ci
940a1d56debSopenharmony_ci        impl From<&$type> for JsonValue {
941a1d56debSopenharmony_ci            #[doc = concat!("从 &", stringify!($type), " 转换为 JsonValue。")]
942a1d56debSopenharmony_ci            ///
943a1d56debSopenharmony_ci            /// # Examples
944a1d56debSopenharmony_ci            /// ```
945a1d56debSopenharmony_ci            /// use ylong_json::*;
946a1d56debSopenharmony_ci            ///
947a1d56debSopenharmony_ci            #[doc = concat!("let value: JsonValue = ", stringify!($type), "::default().into();")]
948a1d56debSopenharmony_ci            /// ```
949a1d56debSopenharmony_ci            fn from(t: &$type) -> Self {
950a1d56debSopenharmony_ci                $func(t.clone().into())
951a1d56debSopenharmony_ci            }
952a1d56debSopenharmony_ci        }
953a1d56debSopenharmony_ci
954a1d56debSopenharmony_ci        impl From<&mut $type> for JsonValue {
955a1d56debSopenharmony_ci            #[doc = concat!("从 &mut", stringify!($type), " 转换为 JsonValue。")]
956a1d56debSopenharmony_ci            ///
957a1d56debSopenharmony_ci            /// # Examples
958a1d56debSopenharmony_ci            /// ```
959a1d56debSopenharmony_ci            /// use ylong_json::*;
960a1d56debSopenharmony_ci            ///
961a1d56debSopenharmony_ci            #[doc = concat!("let value: JsonValue = ", stringify!($type), "::default().into();")]
962a1d56debSopenharmony_ci            /// ```
963a1d56debSopenharmony_ci            fn from(t: &mut $type) -> Self {
964a1d56debSopenharmony_ci                $func(t.clone().into())
965a1d56debSopenharmony_ci            }
966a1d56debSopenharmony_ci        }
967a1d56debSopenharmony_ci    };
968a1d56debSopenharmony_ci}
969a1d56debSopenharmony_ci
970a1d56debSopenharmony_cimacro_rules! number_value_from_type {
971a1d56debSopenharmony_ci    ($($type: tt),* $(,)?) => {
972a1d56debSopenharmony_ci        $(
973a1d56debSopenharmony_ci            impl From<$type> for JsonValue {
974a1d56debSopenharmony_ci                #[doc = concat!("从 ", stringify!($type), " 转换为 JsonValue。")]
975a1d56debSopenharmony_ci                ///
976a1d56debSopenharmony_ci                /// # Examples
977a1d56debSopenharmony_ci                /// ```
978a1d56debSopenharmony_ci                /// use ylong_json::JsonValue;
979a1d56debSopenharmony_ci                ///
980a1d56debSopenharmony_ci                /// // Due to the conversion to f64, there may be a loss of accuracy.
981a1d56debSopenharmony_ci                #[doc = concat!("let value: JsonValue = ", stringify!($type), "::MAX.into();")]
982a1d56debSopenharmony_ci                /// ```
983a1d56debSopenharmony_ci                fn from(t: $type) -> Self {
984a1d56debSopenharmony_ci                    Self::Number(Number::from(t))
985a1d56debSopenharmony_ci                }
986a1d56debSopenharmony_ci            }
987a1d56debSopenharmony_ci        )*
988a1d56debSopenharmony_ci    }
989a1d56debSopenharmony_ci}
990a1d56debSopenharmony_ci
991a1d56debSopenharmony_cijson_value_from_type!(bool, JsonValue::new_boolean);
992a1d56debSopenharmony_cijson_value_from_type!(Array, JsonValue::new_array);
993a1d56debSopenharmony_cijson_value_from_type!(Object, JsonValue::new_object);
994a1d56debSopenharmony_ci
995a1d56debSopenharmony_cinumber_value_from_type!(i8, i16, i32, i64, isize, u8, u16, u32, u64, usize, f32, f64);
996a1d56debSopenharmony_ci
997a1d56debSopenharmony_ci#[cfg(test)]
998a1d56debSopenharmony_cimod ut_json_value {
999a1d56debSopenharmony_ci    use super::{array::Array, object::Object, JsonValue};
1000a1d56debSopenharmony_ci    use std::io::{ErrorKind, Read, Result};
1001a1d56debSopenharmony_ci    use std::str::FromStr;
1002a1d56debSopenharmony_ci
1003a1d56debSopenharmony_ci    /// UT test for `JsonValue::fmt`.
1004a1d56debSopenharmony_ci    ///
1005a1d56debSopenharmony_ci    /// # Title
1006a1d56debSopenharmony_ci    /// ut_json_value_fmt
1007a1d56debSopenharmony_ci    ///
1008a1d56debSopenharmony_ci    /// # Brief
1009a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1010a1d56debSopenharmony_ci    /// 2. Calls `Display::fmt` and `Debug::fmt`.
1011a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1012a1d56debSopenharmony_ci    #[test]
1013a1d56debSopenharmony_ci    fn ut_json_value_fmt() {
1014a1d56debSopenharmony_ci        let value = JsonValue::new_null();
1015a1d56debSopenharmony_ci        assert_eq!(format!("{value}"), "null");
1016a1d56debSopenharmony_ci        assert_eq!(format!("{value:?}"), "null");
1017a1d56debSopenharmony_ci
1018a1d56debSopenharmony_ci        let value = JsonValue::new_boolean(false);
1019a1d56debSopenharmony_ci        assert_eq!(format!("{value}"), "false");
1020a1d56debSopenharmony_ci        assert_eq!(format!("{value:?}"), "false");
1021a1d56debSopenharmony_ci
1022a1d56debSopenharmony_ci        let value = JsonValue::new_number(12.34.into());
1023a1d56debSopenharmony_ci        assert_eq!(format!("{value}"), "12.34");
1024a1d56debSopenharmony_ci        assert_eq!(format!("{value:?}"), "12.34");
1025a1d56debSopenharmony_ci
1026a1d56debSopenharmony_ci        let value = JsonValue::new_string("Hello");
1027a1d56debSopenharmony_ci        assert_eq!(format!("{value}"), "\"Hello\"");
1028a1d56debSopenharmony_ci        assert_eq!(format!("{value:?}"), "\"Hello\"");
1029a1d56debSopenharmony_ci
1030a1d56debSopenharmony_ci        let value = JsonValue::new_array(array!(false, JsonValue::Null, 12.34));
1031a1d56debSopenharmony_ci        assert_eq!(format!("{value}"), "[false,null,12.34]");
1032a1d56debSopenharmony_ci        assert_eq!(format!("{value}"), "[false,null,12.34]");
1033a1d56debSopenharmony_ci
1034a1d56debSopenharmony_ci        let object = object!("null" => JsonValue::Null);
1035a1d56debSopenharmony_ci        let value = JsonValue::new_object(object);
1036a1d56debSopenharmony_ci        assert_eq!(format!("{value}"), "{\"null\":null}");
1037a1d56debSopenharmony_ci        assert_eq!(format!("{value}"), "{\"null\":null}");
1038a1d56debSopenharmony_ci    }
1039a1d56debSopenharmony_ci
1040a1d56debSopenharmony_ci    /// UT test for `JsonValue::clone`.
1041a1d56debSopenharmony_ci    ///
1042a1d56debSopenharmony_ci    /// # Title
1043a1d56debSopenharmony_ci    /// ut_json_value_fmt
1044a1d56debSopenharmony_ci    ///
1045a1d56debSopenharmony_ci    /// # Brief
1046a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1047a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::clone`.
1048a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1049a1d56debSopenharmony_ci    #[test]
1050a1d56debSopenharmony_ci    fn ut_json_value_clone() {
1051a1d56debSopenharmony_ci        let value1 = JsonValue::new_null();
1052a1d56debSopenharmony_ci        assert_eq!(value1, value1.clone());
1053a1d56debSopenharmony_ci    }
1054a1d56debSopenharmony_ci
1055a1d56debSopenharmony_ci    /// UT test for `JsonValue::is_null`.
1056a1d56debSopenharmony_ci    ///
1057a1d56debSopenharmony_ci    /// # Title
1058a1d56debSopenharmony_ci    /// ut_json_value_is_null
1059a1d56debSopenharmony_ci    ///
1060a1d56debSopenharmony_ci    /// # Brief
1061a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1062a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::is_null`.
1063a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1064a1d56debSopenharmony_ci    #[test]
1065a1d56debSopenharmony_ci    fn ut_json_value_is_null() {
1066a1d56debSopenharmony_ci        assert!(JsonValue::new_null().is_null());
1067a1d56debSopenharmony_ci        assert!(!JsonValue::new_boolean(true).is_null());
1068a1d56debSopenharmony_ci        assert!(!JsonValue::new_boolean(false).is_null());
1069a1d56debSopenharmony_ci        assert!(!JsonValue::new_number(12.34.into()).is_null());
1070a1d56debSopenharmony_ci        assert!(!JsonValue::new_string("hello").is_null());
1071a1d56debSopenharmony_ci        assert!(!JsonValue::new_array(Array::new()).is_null());
1072a1d56debSopenharmony_ci        assert!(!JsonValue::new_object(Object::new()).is_null());
1073a1d56debSopenharmony_ci    }
1074a1d56debSopenharmony_ci
1075a1d56debSopenharmony_ci    /// UT test for `JsonValue::is_true`.
1076a1d56debSopenharmony_ci    ///
1077a1d56debSopenharmony_ci    /// # Title
1078a1d56debSopenharmony_ci    /// ut_json_value_is_true
1079a1d56debSopenharmony_ci    ///
1080a1d56debSopenharmony_ci    /// # Brief
1081a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1082a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::is_true`.
1083a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1084a1d56debSopenharmony_ci    #[test]
1085a1d56debSopenharmony_ci    fn ut_json_value_is_true() {
1086a1d56debSopenharmony_ci        assert!(!JsonValue::new_null().is_true());
1087a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(true).is_true());
1088a1d56debSopenharmony_ci        assert!(!JsonValue::new_boolean(false).is_true());
1089a1d56debSopenharmony_ci        assert!(!JsonValue::new_number(12.34.into()).is_true());
1090a1d56debSopenharmony_ci        assert!(!JsonValue::new_string("hello").is_true());
1091a1d56debSopenharmony_ci        assert!(!JsonValue::new_array(Array::new()).is_true());
1092a1d56debSopenharmony_ci        assert!(!JsonValue::new_object(Object::new()).is_true());
1093a1d56debSopenharmony_ci    }
1094a1d56debSopenharmony_ci
1095a1d56debSopenharmony_ci    /// UT test for `JsonValue::is_false`.
1096a1d56debSopenharmony_ci    ///
1097a1d56debSopenharmony_ci    /// # Title
1098a1d56debSopenharmony_ci    /// ut_json_value_is_false
1099a1d56debSopenharmony_ci    ///
1100a1d56debSopenharmony_ci    /// # Brief
1101a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1102a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::is_false`.
1103a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1104a1d56debSopenharmony_ci    #[test]
1105a1d56debSopenharmony_ci    fn ut_json_value_is_false() {
1106a1d56debSopenharmony_ci        assert!(!JsonValue::new_null().is_false());
1107a1d56debSopenharmony_ci        assert!(!JsonValue::new_boolean(true).is_false());
1108a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(false).is_false());
1109a1d56debSopenharmony_ci        assert!(!JsonValue::new_number(12.34.into()).is_false());
1110a1d56debSopenharmony_ci        assert!(!JsonValue::new_string("hello").is_false());
1111a1d56debSopenharmony_ci        assert!(!JsonValue::new_array(Array::new()).is_false());
1112a1d56debSopenharmony_ci        assert!(!JsonValue::new_object(Object::new()).is_false());
1113a1d56debSopenharmony_ci    }
1114a1d56debSopenharmony_ci
1115a1d56debSopenharmony_ci    /// UT test for `JsonValue::is_boolean`.
1116a1d56debSopenharmony_ci    ///
1117a1d56debSopenharmony_ci    /// # Title
1118a1d56debSopenharmony_ci    /// ut_json_value_is_false
1119a1d56debSopenharmony_ci    ///
1120a1d56debSopenharmony_ci    /// # Brief
1121a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1122a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::is_boolean`.
1123a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1124a1d56debSopenharmony_ci    #[test]
1125a1d56debSopenharmony_ci    fn ut_json_value_is_boolean() {
1126a1d56debSopenharmony_ci        assert!(!JsonValue::new_null().is_boolean());
1127a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(true).is_boolean());
1128a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(false).is_boolean());
1129a1d56debSopenharmony_ci        assert!(!JsonValue::new_number(12.34.into()).is_boolean());
1130a1d56debSopenharmony_ci        assert!(!JsonValue::new_string("hello").is_boolean());
1131a1d56debSopenharmony_ci        assert!(!JsonValue::new_array(Array::new()).is_boolean());
1132a1d56debSopenharmony_ci        assert!(!JsonValue::new_object(Object::new()).is_boolean());
1133a1d56debSopenharmony_ci    }
1134a1d56debSopenharmony_ci
1135a1d56debSopenharmony_ci    /// UT test for `JsonValue::is_number`.
1136a1d56debSopenharmony_ci    ///
1137a1d56debSopenharmony_ci    /// # Title
1138a1d56debSopenharmony_ci    /// ut_json_value_is_number
1139a1d56debSopenharmony_ci    ///
1140a1d56debSopenharmony_ci    /// # Brief
1141a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1142a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::is_number`.
1143a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1144a1d56debSopenharmony_ci    #[test]
1145a1d56debSopenharmony_ci    fn ut_json_value_is_number() {
1146a1d56debSopenharmony_ci        assert!(!JsonValue::new_null().is_number());
1147a1d56debSopenharmony_ci        assert!(!JsonValue::new_boolean(true).is_number());
1148a1d56debSopenharmony_ci        assert!(!JsonValue::new_boolean(false).is_number());
1149a1d56debSopenharmony_ci        assert!(JsonValue::new_number(12.34.into()).is_number());
1150a1d56debSopenharmony_ci        assert!(!JsonValue::new_string("hello").is_number());
1151a1d56debSopenharmony_ci        assert!(!JsonValue::new_array(Array::new()).is_number());
1152a1d56debSopenharmony_ci        assert!(!JsonValue::new_object(Object::new()).is_number());
1153a1d56debSopenharmony_ci    }
1154a1d56debSopenharmony_ci
1155a1d56debSopenharmony_ci    /// UT test for `JsonValue::is_string`.
1156a1d56debSopenharmony_ci    ///
1157a1d56debSopenharmony_ci    /// # Title
1158a1d56debSopenharmony_ci    /// ut_json_value_is_string
1159a1d56debSopenharmony_ci    ///
1160a1d56debSopenharmony_ci    /// # Brief
1161a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1162a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::is_string`.
1163a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1164a1d56debSopenharmony_ci    #[test]
1165a1d56debSopenharmony_ci    fn ut_json_value_is_string() {
1166a1d56debSopenharmony_ci        assert!(!JsonValue::new_null().is_string());
1167a1d56debSopenharmony_ci        assert!(!JsonValue::new_boolean(true).is_string());
1168a1d56debSopenharmony_ci        assert!(!JsonValue::new_boolean(false).is_string());
1169a1d56debSopenharmony_ci        assert!(!JsonValue::new_number(12.34.into()).is_string());
1170a1d56debSopenharmony_ci        assert!(JsonValue::new_string("hello").is_string());
1171a1d56debSopenharmony_ci        assert!(!JsonValue::new_array(Array::new()).is_string());
1172a1d56debSopenharmony_ci        assert!(!JsonValue::new_object(Object::new()).is_string());
1173a1d56debSopenharmony_ci    }
1174a1d56debSopenharmony_ci
1175a1d56debSopenharmony_ci    /// UT test for `JsonValue::is_array`.
1176a1d56debSopenharmony_ci    ///
1177a1d56debSopenharmony_ci    /// # Title
1178a1d56debSopenharmony_ci    /// ut_json_value_is_array
1179a1d56debSopenharmony_ci    ///
1180a1d56debSopenharmony_ci    /// # Brief
1181a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1182a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::is_array`.
1183a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1184a1d56debSopenharmony_ci    #[test]
1185a1d56debSopenharmony_ci    fn ut_json_value_is_array() {
1186a1d56debSopenharmony_ci        assert!(!JsonValue::new_null().is_array());
1187a1d56debSopenharmony_ci        assert!(!JsonValue::new_boolean(true).is_array());
1188a1d56debSopenharmony_ci        assert!(!JsonValue::new_boolean(false).is_array());
1189a1d56debSopenharmony_ci        assert!(!JsonValue::new_number(12.34.into()).is_array());
1190a1d56debSopenharmony_ci        assert!(!JsonValue::new_string("hello").is_array());
1191a1d56debSopenharmony_ci        assert!(JsonValue::new_array(Array::new()).is_array());
1192a1d56debSopenharmony_ci        assert!(!JsonValue::new_object(Object::new()).is_array());
1193a1d56debSopenharmony_ci    }
1194a1d56debSopenharmony_ci
1195a1d56debSopenharmony_ci    /// UT test for `JsonValue::is_object`.
1196a1d56debSopenharmony_ci    ///
1197a1d56debSopenharmony_ci    /// # Title
1198a1d56debSopenharmony_ci    /// ut_json_value_is_object
1199a1d56debSopenharmony_ci    ///
1200a1d56debSopenharmony_ci    /// # Brief
1201a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1202a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::is_object`.
1203a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1204a1d56debSopenharmony_ci    #[test]
1205a1d56debSopenharmony_ci    fn ut_json_value_is_object() {
1206a1d56debSopenharmony_ci        assert!(!JsonValue::new_null().is_object());
1207a1d56debSopenharmony_ci        assert!(!JsonValue::new_boolean(true).is_object());
1208a1d56debSopenharmony_ci        assert!(!JsonValue::new_boolean(false).is_object());
1209a1d56debSopenharmony_ci        assert!(!JsonValue::new_number(12.34.into()).is_object());
1210a1d56debSopenharmony_ci        assert!(!JsonValue::new_string("hello").is_object());
1211a1d56debSopenharmony_ci        assert!(!JsonValue::new_array(Array::new()).is_object());
1212a1d56debSopenharmony_ci        assert!(JsonValue::new_object(Object::new()).is_object());
1213a1d56debSopenharmony_ci    }
1214a1d56debSopenharmony_ci
1215a1d56debSopenharmony_ci    /// UT test for `JsonValue::try_as_boolean`.
1216a1d56debSopenharmony_ci    ///
1217a1d56debSopenharmony_ci    /// # Title
1218a1d56debSopenharmony_ci    /// ut_json_value_try_as_boolean
1219a1d56debSopenharmony_ci    ///
1220a1d56debSopenharmony_ci    /// # Brief
1221a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1222a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::try_as_boolean`.
1223a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1224a1d56debSopenharmony_ci    #[test]
1225a1d56debSopenharmony_ci    fn ut_json_value_try_as_boolean() {
1226a1d56debSopenharmony_ci        assert!(JsonValue::new_null().try_as_boolean().is_err());
1227a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(true).try_as_boolean().is_ok());
1228a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(false).try_as_boolean().is_ok());
1229a1d56debSopenharmony_ci        assert!(JsonValue::new_number(12.34.into())
1230a1d56debSopenharmony_ci            .try_as_boolean()
1231a1d56debSopenharmony_ci            .is_err());
1232a1d56debSopenharmony_ci        assert!(JsonValue::new_string("hello").try_as_boolean().is_err());
1233a1d56debSopenharmony_ci        assert!(JsonValue::new_array(Array::new()).try_as_boolean().is_err());
1234a1d56debSopenharmony_ci        assert!(JsonValue::new_object(Object::new())
1235a1d56debSopenharmony_ci            .try_as_boolean()
1236a1d56debSopenharmony_ci            .is_err());
1237a1d56debSopenharmony_ci    }
1238a1d56debSopenharmony_ci
1239a1d56debSopenharmony_ci    /// UT test for `JsonValue::try_as_number`.
1240a1d56debSopenharmony_ci    ///
1241a1d56debSopenharmony_ci    /// # Title
1242a1d56debSopenharmony_ci    /// ut_json_value_try_as_number
1243a1d56debSopenharmony_ci    ///
1244a1d56debSopenharmony_ci    /// # Brief
1245a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1246a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::try_as_number`.
1247a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1248a1d56debSopenharmony_ci    #[test]
1249a1d56debSopenharmony_ci    fn ut_json_value_try_as_number() {
1250a1d56debSopenharmony_ci        assert!(JsonValue::new_null().try_as_number().is_err());
1251a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(true).try_as_number().is_err());
1252a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(false).try_as_number().is_err());
1253a1d56debSopenharmony_ci        assert!(JsonValue::new_number(12.34.into()).try_as_number().is_ok());
1254a1d56debSopenharmony_ci        assert!(JsonValue::new_string("hello").try_as_number().is_err());
1255a1d56debSopenharmony_ci        assert!(JsonValue::new_array(Array::new()).try_as_number().is_err());
1256a1d56debSopenharmony_ci        assert!(JsonValue::new_object(Object::new())
1257a1d56debSopenharmony_ci            .try_as_number()
1258a1d56debSopenharmony_ci            .is_err());
1259a1d56debSopenharmony_ci    }
1260a1d56debSopenharmony_ci
1261a1d56debSopenharmony_ci    /// UT test for `JsonValue::try_as_string`.
1262a1d56debSopenharmony_ci    ///
1263a1d56debSopenharmony_ci    /// # Title
1264a1d56debSopenharmony_ci    /// ut_json_value_try_as_string
1265a1d56debSopenharmony_ci    ///
1266a1d56debSopenharmony_ci    /// # Brief
1267a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1268a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::try_as_string`.
1269a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1270a1d56debSopenharmony_ci    #[test]
1271a1d56debSopenharmony_ci    fn ut_json_value_try_as_string() {
1272a1d56debSopenharmony_ci        assert!(JsonValue::new_null().try_as_string().is_err());
1273a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(true).try_as_string().is_err());
1274a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(false).try_as_string().is_err());
1275a1d56debSopenharmony_ci        assert!(JsonValue::new_number(12.34.into()).try_as_string().is_err());
1276a1d56debSopenharmony_ci        assert!(JsonValue::new_string("hello").try_as_string().is_ok());
1277a1d56debSopenharmony_ci        assert!(JsonValue::new_array(Array::new()).try_as_string().is_err());
1278a1d56debSopenharmony_ci        assert!(JsonValue::new_object(Object::new())
1279a1d56debSopenharmony_ci            .try_as_string()
1280a1d56debSopenharmony_ci            .is_err());
1281a1d56debSopenharmony_ci    }
1282a1d56debSopenharmony_ci
1283a1d56debSopenharmony_ci    /// UT test for `JsonValue::try_as_array`.
1284a1d56debSopenharmony_ci    ///
1285a1d56debSopenharmony_ci    /// # Title
1286a1d56debSopenharmony_ci    /// ut_json_value_try_as_array
1287a1d56debSopenharmony_ci    ///
1288a1d56debSopenharmony_ci    /// # Brief
1289a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1290a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::try_as_array`.
1291a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1292a1d56debSopenharmony_ci    #[test]
1293a1d56debSopenharmony_ci    fn ut_json_value_try_as_array() {
1294a1d56debSopenharmony_ci        assert!(JsonValue::new_null().try_as_array().is_err());
1295a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(true).try_as_array().is_err());
1296a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(false).try_as_array().is_err());
1297a1d56debSopenharmony_ci        assert!(JsonValue::new_number(12.34.into()).try_as_array().is_err());
1298a1d56debSopenharmony_ci        assert!(JsonValue::new_string("hello").try_as_array().is_err());
1299a1d56debSopenharmony_ci        assert!(JsonValue::new_array(Array::new()).try_as_array().is_ok());
1300a1d56debSopenharmony_ci        assert!(JsonValue::new_object(Object::new()).try_as_array().is_err());
1301a1d56debSopenharmony_ci    }
1302a1d56debSopenharmony_ci
1303a1d56debSopenharmony_ci    /// UT test for `JsonValue::try_as_object`.
1304a1d56debSopenharmony_ci    ///
1305a1d56debSopenharmony_ci    /// # Title
1306a1d56debSopenharmony_ci    /// ut_json_value_try_as_object
1307a1d56debSopenharmony_ci    ///
1308a1d56debSopenharmony_ci    /// # Brief
1309a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1310a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::try_as_object`.
1311a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1312a1d56debSopenharmony_ci    #[test]
1313a1d56debSopenharmony_ci    fn ut_json_value_try_as_object() {
1314a1d56debSopenharmony_ci        assert!(JsonValue::new_null().try_as_object().is_err());
1315a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(true).try_as_object().is_err());
1316a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(false).try_as_object().is_err());
1317a1d56debSopenharmony_ci        assert!(JsonValue::new_number(12.34.into()).try_as_object().is_err());
1318a1d56debSopenharmony_ci        assert!(JsonValue::new_string("hello").try_as_object().is_err());
1319a1d56debSopenharmony_ci        assert!(JsonValue::new_array(Array::new()).try_as_object().is_err());
1320a1d56debSopenharmony_ci        assert!(JsonValue::new_object(Object::new()).try_as_object().is_ok());
1321a1d56debSopenharmony_ci    }
1322a1d56debSopenharmony_ci
1323a1d56debSopenharmony_ci    /// UT test for `JsonValue::try_as_mut_boolean`.
1324a1d56debSopenharmony_ci    ///
1325a1d56debSopenharmony_ci    /// # Title
1326a1d56debSopenharmony_ci    /// ut_json_value_try_as_mut_boolean
1327a1d56debSopenharmony_ci    ///
1328a1d56debSopenharmony_ci    /// # Brief
1329a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1330a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::try_as_mut_boolean`.
1331a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1332a1d56debSopenharmony_ci    #[test]
1333a1d56debSopenharmony_ci    fn ut_json_value_try_as_mut_boolean() {
1334a1d56debSopenharmony_ci        assert!(JsonValue::new_null().try_as_mut_boolean().is_err());
1335a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(true).try_as_mut_boolean().is_ok());
1336a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(false).try_as_mut_boolean().is_ok());
1337a1d56debSopenharmony_ci        assert!(JsonValue::new_number(12.34.into())
1338a1d56debSopenharmony_ci            .try_as_mut_boolean()
1339a1d56debSopenharmony_ci            .is_err());
1340a1d56debSopenharmony_ci        assert!(JsonValue::new_string("hello").try_as_mut_boolean().is_err());
1341a1d56debSopenharmony_ci        assert!(JsonValue::new_array(Array::new())
1342a1d56debSopenharmony_ci            .try_as_mut_boolean()
1343a1d56debSopenharmony_ci            .is_err());
1344a1d56debSopenharmony_ci        assert!(JsonValue::new_object(Object::new())
1345a1d56debSopenharmony_ci            .try_as_mut_boolean()
1346a1d56debSopenharmony_ci            .is_err());
1347a1d56debSopenharmony_ci    }
1348a1d56debSopenharmony_ci
1349a1d56debSopenharmony_ci    /// UT test for `JsonValue::try_as_mut_number`.
1350a1d56debSopenharmony_ci    ///
1351a1d56debSopenharmony_ci    /// # Title
1352a1d56debSopenharmony_ci    /// ut_json_value_try_as_mut_number
1353a1d56debSopenharmony_ci    ///
1354a1d56debSopenharmony_ci    /// # Brief
1355a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1356a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::try_as_mut_number`.
1357a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1358a1d56debSopenharmony_ci    #[test]
1359a1d56debSopenharmony_ci    fn ut_json_value_try_as_mut_number() {
1360a1d56debSopenharmony_ci        assert!(JsonValue::new_null().try_as_mut_number().is_err());
1361a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(true).try_as_mut_number().is_err());
1362a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(false).try_as_mut_number().is_err());
1363a1d56debSopenharmony_ci        assert!(JsonValue::new_number(12.34.into())
1364a1d56debSopenharmony_ci            .try_as_mut_number()
1365a1d56debSopenharmony_ci            .is_ok());
1366a1d56debSopenharmony_ci        assert!(JsonValue::new_string("hello").try_as_mut_number().is_err());
1367a1d56debSopenharmony_ci        assert!(JsonValue::new_array(Array::new())
1368a1d56debSopenharmony_ci            .try_as_mut_number()
1369a1d56debSopenharmony_ci            .is_err());
1370a1d56debSopenharmony_ci        assert!(JsonValue::new_object(Object::new())
1371a1d56debSopenharmony_ci            .try_as_mut_number()
1372a1d56debSopenharmony_ci            .is_err());
1373a1d56debSopenharmony_ci    }
1374a1d56debSopenharmony_ci
1375a1d56debSopenharmony_ci    /// UT test for `JsonValue::try_as_mut_string`.
1376a1d56debSopenharmony_ci    ///
1377a1d56debSopenharmony_ci    /// # Title
1378a1d56debSopenharmony_ci    /// ut_json_value_try_as_mut_string
1379a1d56debSopenharmony_ci    ///
1380a1d56debSopenharmony_ci    /// # Brief
1381a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1382a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::try_as_mut_string`.
1383a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1384a1d56debSopenharmony_ci    #[test]
1385a1d56debSopenharmony_ci    fn ut_json_value_try_as_mut_string() {
1386a1d56debSopenharmony_ci        assert!(JsonValue::new_null().try_as_mut_string().is_err());
1387a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(true).try_as_mut_string().is_err());
1388a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(false).try_as_mut_string().is_err());
1389a1d56debSopenharmony_ci        assert!(JsonValue::new_number(12.34.into())
1390a1d56debSopenharmony_ci            .try_as_mut_string()
1391a1d56debSopenharmony_ci            .is_err());
1392a1d56debSopenharmony_ci        assert!(JsonValue::new_string("hello").try_as_mut_string().is_ok());
1393a1d56debSopenharmony_ci        assert!(JsonValue::new_array(Array::new())
1394a1d56debSopenharmony_ci            .try_as_mut_string()
1395a1d56debSopenharmony_ci            .is_err());
1396a1d56debSopenharmony_ci        assert!(JsonValue::new_object(Object::new())
1397a1d56debSopenharmony_ci            .try_as_mut_string()
1398a1d56debSopenharmony_ci            .is_err());
1399a1d56debSopenharmony_ci    }
1400a1d56debSopenharmony_ci
1401a1d56debSopenharmony_ci    /// UT test for `JsonValue::try_as_mut_array`.
1402a1d56debSopenharmony_ci    ///
1403a1d56debSopenharmony_ci    /// # Title
1404a1d56debSopenharmony_ci    /// ut_json_value_try_as_mut_array
1405a1d56debSopenharmony_ci    ///
1406a1d56debSopenharmony_ci    /// # Brief
1407a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1408a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::try_as_mut_array`.
1409a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1410a1d56debSopenharmony_ci    #[test]
1411a1d56debSopenharmony_ci    fn ut_json_value_try_as_mut_array() {
1412a1d56debSopenharmony_ci        assert!(JsonValue::new_null().try_as_mut_array().is_err());
1413a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(true).try_as_mut_array().is_err());
1414a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(false).try_as_mut_array().is_err());
1415a1d56debSopenharmony_ci        assert!(JsonValue::new_number(12.34.into())
1416a1d56debSopenharmony_ci            .try_as_mut_array()
1417a1d56debSopenharmony_ci            .is_err());
1418a1d56debSopenharmony_ci        assert!(JsonValue::new_string("hello").try_as_mut_array().is_err());
1419a1d56debSopenharmony_ci        assert!(JsonValue::new_array(Array::new())
1420a1d56debSopenharmony_ci            .try_as_mut_array()
1421a1d56debSopenharmony_ci            .is_ok());
1422a1d56debSopenharmony_ci        assert!(JsonValue::new_object(Object::new())
1423a1d56debSopenharmony_ci            .try_as_mut_array()
1424a1d56debSopenharmony_ci            .is_err());
1425a1d56debSopenharmony_ci    }
1426a1d56debSopenharmony_ci
1427a1d56debSopenharmony_ci    /// UT test for `JsonValue::try_as_mut_object`.
1428a1d56debSopenharmony_ci    ///
1429a1d56debSopenharmony_ci    /// # Title
1430a1d56debSopenharmony_ci    /// ut_json_value_try_as_mut_object
1431a1d56debSopenharmony_ci    ///
1432a1d56debSopenharmony_ci    /// # Brief
1433a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1434a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::try_as_mut_object`.
1435a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1436a1d56debSopenharmony_ci    #[test]
1437a1d56debSopenharmony_ci    fn ut_json_value_try_as_mut_object() {
1438a1d56debSopenharmony_ci        assert!(JsonValue::new_null().try_as_mut_object().is_err());
1439a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(true).try_as_mut_object().is_err());
1440a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(false).try_as_mut_object().is_err());
1441a1d56debSopenharmony_ci        assert!(JsonValue::new_number(12.34.into())
1442a1d56debSopenharmony_ci            .try_as_mut_object()
1443a1d56debSopenharmony_ci            .is_err());
1444a1d56debSopenharmony_ci        assert!(JsonValue::new_string("hello").try_as_mut_object().is_err());
1445a1d56debSopenharmony_ci        assert!(JsonValue::new_array(Array::new())
1446a1d56debSopenharmony_ci            .try_as_mut_object()
1447a1d56debSopenharmony_ci            .is_err());
1448a1d56debSopenharmony_ci        assert!(JsonValue::new_object(Object::new())
1449a1d56debSopenharmony_ci            .try_as_mut_object()
1450a1d56debSopenharmony_ci            .is_ok());
1451a1d56debSopenharmony_ci    }
1452a1d56debSopenharmony_ci
1453a1d56debSopenharmony_ci    /// UT test for `JsonValue::try_into_boolean`.
1454a1d56debSopenharmony_ci    ///
1455a1d56debSopenharmony_ci    /// # Title
1456a1d56debSopenharmony_ci    /// ut_json_value_try_into_boolean
1457a1d56debSopenharmony_ci    ///
1458a1d56debSopenharmony_ci    /// # Brief
1459a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1460a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::try_into_boolean`.
1461a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1462a1d56debSopenharmony_ci    #[test]
1463a1d56debSopenharmony_ci    fn ut_json_value_try_into_boolean() {
1464a1d56debSopenharmony_ci        assert!(JsonValue::new_null().try_into_boolean().is_err());
1465a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(true).try_into_boolean().is_ok());
1466a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(false).try_into_boolean().is_ok());
1467a1d56debSopenharmony_ci        assert!(JsonValue::new_number(12.34.into())
1468a1d56debSopenharmony_ci            .try_into_boolean()
1469a1d56debSopenharmony_ci            .is_err());
1470a1d56debSopenharmony_ci        assert!(JsonValue::new_string("hello").try_into_boolean().is_err());
1471a1d56debSopenharmony_ci        assert!(JsonValue::new_array(Array::new())
1472a1d56debSopenharmony_ci            .try_into_boolean()
1473a1d56debSopenharmony_ci            .is_err());
1474a1d56debSopenharmony_ci        assert!(JsonValue::new_object(Object::new())
1475a1d56debSopenharmony_ci            .try_into_boolean()
1476a1d56debSopenharmony_ci            .is_err());
1477a1d56debSopenharmony_ci    }
1478a1d56debSopenharmony_ci
1479a1d56debSopenharmony_ci    /// UT test for `JsonValue::try_into_number`.
1480a1d56debSopenharmony_ci    ///
1481a1d56debSopenharmony_ci    /// # Title
1482a1d56debSopenharmony_ci    /// ut_json_value_try_into_number
1483a1d56debSopenharmony_ci    ///
1484a1d56debSopenharmony_ci    /// # Brief
1485a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1486a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::try_into_number`.
1487a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1488a1d56debSopenharmony_ci    #[test]
1489a1d56debSopenharmony_ci    fn ut_json_value_try_into_number() {
1490a1d56debSopenharmony_ci        assert!(JsonValue::new_null().try_into_number().is_err());
1491a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(true).try_into_number().is_err());
1492a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(false).try_into_number().is_err());
1493a1d56debSopenharmony_ci        assert!(JsonValue::new_number(12.34.into())
1494a1d56debSopenharmony_ci            .try_into_number()
1495a1d56debSopenharmony_ci            .is_ok());
1496a1d56debSopenharmony_ci        assert!(JsonValue::new_string("hello").try_into_number().is_err());
1497a1d56debSopenharmony_ci        assert!(JsonValue::new_array(Array::new())
1498a1d56debSopenharmony_ci            .try_into_number()
1499a1d56debSopenharmony_ci            .is_err());
1500a1d56debSopenharmony_ci        assert!(JsonValue::new_object(Object::new())
1501a1d56debSopenharmony_ci            .try_into_number()
1502a1d56debSopenharmony_ci            .is_err());
1503a1d56debSopenharmony_ci    }
1504a1d56debSopenharmony_ci
1505a1d56debSopenharmony_ci    /// UT test for `JsonValue::try_into_string`.
1506a1d56debSopenharmony_ci    ///
1507a1d56debSopenharmony_ci    /// # Title
1508a1d56debSopenharmony_ci    /// ut_json_value_try_into_string
1509a1d56debSopenharmony_ci    ///
1510a1d56debSopenharmony_ci    /// # Brief
1511a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1512a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::try_into_string`.
1513a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1514a1d56debSopenharmony_ci    #[test]
1515a1d56debSopenharmony_ci    fn ut_json_value_try_into_string() {
1516a1d56debSopenharmony_ci        assert!(JsonValue::new_null().try_into_string().is_err());
1517a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(true).try_into_string().is_err());
1518a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(false).try_into_string().is_err());
1519a1d56debSopenharmony_ci        assert!(JsonValue::new_number(12.34.into())
1520a1d56debSopenharmony_ci            .try_into_string()
1521a1d56debSopenharmony_ci            .is_err());
1522a1d56debSopenharmony_ci        assert!(JsonValue::new_string("hello").try_into_string().is_ok());
1523a1d56debSopenharmony_ci        assert!(JsonValue::new_array(Array::new())
1524a1d56debSopenharmony_ci            .try_into_string()
1525a1d56debSopenharmony_ci            .is_err());
1526a1d56debSopenharmony_ci        assert!(JsonValue::new_object(Object::new())
1527a1d56debSopenharmony_ci            .try_into_string()
1528a1d56debSopenharmony_ci            .is_err());
1529a1d56debSopenharmony_ci    }
1530a1d56debSopenharmony_ci
1531a1d56debSopenharmony_ci    /// UT test for `JsonValue::try_into_array`.
1532a1d56debSopenharmony_ci    ///
1533a1d56debSopenharmony_ci    /// # Title
1534a1d56debSopenharmony_ci    /// ut_json_value_try_into_array
1535a1d56debSopenharmony_ci    ///
1536a1d56debSopenharmony_ci    /// # Brief
1537a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1538a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::try_into_array`.
1539a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1540a1d56debSopenharmony_ci    #[test]
1541a1d56debSopenharmony_ci    fn ut_json_value_try_into_array() {
1542a1d56debSopenharmony_ci        assert!(JsonValue::new_null().try_into_array().is_err());
1543a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(true).try_into_array().is_err());
1544a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(false).try_into_array().is_err());
1545a1d56debSopenharmony_ci        assert!(JsonValue::new_number(12.34.into())
1546a1d56debSopenharmony_ci            .try_into_array()
1547a1d56debSopenharmony_ci            .is_err());
1548a1d56debSopenharmony_ci        assert!(JsonValue::new_string("hello").try_into_array().is_err());
1549a1d56debSopenharmony_ci        assert!(JsonValue::new_array(Array::new()).try_into_array().is_ok());
1550a1d56debSopenharmony_ci        assert!(JsonValue::new_object(Object::new())
1551a1d56debSopenharmony_ci            .try_into_array()
1552a1d56debSopenharmony_ci            .is_err());
1553a1d56debSopenharmony_ci    }
1554a1d56debSopenharmony_ci
1555a1d56debSopenharmony_ci    /// UT test for `JsonValue::try_into_object`.
1556a1d56debSopenharmony_ci    ///
1557a1d56debSopenharmony_ci    /// # Title
1558a1d56debSopenharmony_ci    /// ut_json_value_try_into_object
1559a1d56debSopenharmony_ci    ///
1560a1d56debSopenharmony_ci    /// # Brief
1561a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1562a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::try_into_object`.
1563a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1564a1d56debSopenharmony_ci    #[test]
1565a1d56debSopenharmony_ci    fn ut_json_value_try_into_object() {
1566a1d56debSopenharmony_ci        assert!(JsonValue::new_null().try_into_object().is_err());
1567a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(true).try_into_object().is_err());
1568a1d56debSopenharmony_ci        assert!(JsonValue::new_boolean(false).try_into_object().is_err());
1569a1d56debSopenharmony_ci        assert!(JsonValue::new_number(12.34.into())
1570a1d56debSopenharmony_ci            .try_into_object()
1571a1d56debSopenharmony_ci            .is_err());
1572a1d56debSopenharmony_ci        assert!(JsonValue::new_string("hello").try_into_object().is_err());
1573a1d56debSopenharmony_ci        assert!(JsonValue::new_array(Array::new())
1574a1d56debSopenharmony_ci            .try_into_object()
1575a1d56debSopenharmony_ci            .is_err());
1576a1d56debSopenharmony_ci        assert!(JsonValue::new_object(Object::new())
1577a1d56debSopenharmony_ci            .try_into_object()
1578a1d56debSopenharmony_ci            .is_ok());
1579a1d56debSopenharmony_ci    }
1580a1d56debSopenharmony_ci
1581a1d56debSopenharmony_ci    /// UT test for `JsonValue::to_formatted_string`.
1582a1d56debSopenharmony_ci    ///
1583a1d56debSopenharmony_ci    /// # Title
1584a1d56debSopenharmony_ci    /// ut_json_value_to_formatted_string
1585a1d56debSopenharmony_ci    ///
1586a1d56debSopenharmony_ci    /// # Brief
1587a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1588a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::to_formatted_string`.
1589a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1590a1d56debSopenharmony_ci    #[test]
1591a1d56debSopenharmony_ci    fn ut_json_value_to_formatted_string() {
1592a1d56debSopenharmony_ci        assert_eq!(
1593a1d56debSopenharmony_ci            JsonValue::new_null().to_formatted_string().unwrap(),
1594a1d56debSopenharmony_ci            "null\n"
1595a1d56debSopenharmony_ci        );
1596a1d56debSopenharmony_ci    }
1597a1d56debSopenharmony_ci
1598a1d56debSopenharmony_ci    /// UT test for `JsonValue::to_compact_string`.
1599a1d56debSopenharmony_ci    ///
1600a1d56debSopenharmony_ci    /// # Title
1601a1d56debSopenharmony_ci    /// ut_json_value_to_compact_string
1602a1d56debSopenharmony_ci    ///
1603a1d56debSopenharmony_ci    /// # Brief
1604a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1605a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::to_compact_string`.
1606a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1607a1d56debSopenharmony_ci    #[test]
1608a1d56debSopenharmony_ci    fn ut_json_value_to_compact_string() {
1609a1d56debSopenharmony_ci        assert_eq!(JsonValue::new_null().to_compact_string().unwrap(), "null");
1610a1d56debSopenharmony_ci    }
1611a1d56debSopenharmony_ci
1612a1d56debSopenharmony_ci    /// UT test for `JsonValue::from_str`.
1613a1d56debSopenharmony_ci    ///
1614a1d56debSopenharmony_ci    /// # Title
1615a1d56debSopenharmony_ci    /// ut_json_value_from_str
1616a1d56debSopenharmony_ci    ///
1617a1d56debSopenharmony_ci    /// # Brief
1618a1d56debSopenharmony_ci    /// 1. Calls `JsonValue::from_str` to create a `JsonValue`.
1619a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1620a1d56debSopenharmony_ci    #[test]
1621a1d56debSopenharmony_ci    fn ut_json_value_from_str() {
1622a1d56debSopenharmony_ci        assert_eq!(JsonValue::from_str("null").unwrap(), JsonValue::new_null());
1623a1d56debSopenharmony_ci    }
1624a1d56debSopenharmony_ci
1625a1d56debSopenharmony_ci    /// UT test for `JsonValue::eq`.
1626a1d56debSopenharmony_ci    ///
1627a1d56debSopenharmony_ci    /// # Title
1628a1d56debSopenharmony_ci    /// ut_json_value_eq
1629a1d56debSopenharmony_ci    ///
1630a1d56debSopenharmony_ci    /// # Brief
1631a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`s.
1632a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::eq`.
1633a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1634a1d56debSopenharmony_ci    #[test]
1635a1d56debSopenharmony_ci    fn ut_json_value_eq() {
1636a1d56debSopenharmony_ci        assert_eq!(JsonValue::new_null(), JsonValue::new_null());
1637a1d56debSopenharmony_ci        assert_eq!(JsonValue::new_boolean(true), JsonValue::new_boolean(true));
1638a1d56debSopenharmony_ci        assert_eq!(
1639a1d56debSopenharmony_ci            JsonValue::new_number(1.into()),
1640a1d56debSopenharmony_ci            JsonValue::new_number(1.into())
1641a1d56debSopenharmony_ci        );
1642a1d56debSopenharmony_ci        assert_eq!(
1643a1d56debSopenharmony_ci            JsonValue::new_string("string"),
1644a1d56debSopenharmony_ci            JsonValue::new_string("string")
1645a1d56debSopenharmony_ci        );
1646a1d56debSopenharmony_ci        assert_eq!(
1647a1d56debSopenharmony_ci            JsonValue::new_array(Array::new()),
1648a1d56debSopenharmony_ci            JsonValue::new_array(Array::new())
1649a1d56debSopenharmony_ci        );
1650a1d56debSopenharmony_ci        assert_eq!(
1651a1d56debSopenharmony_ci            JsonValue::new_object(Object::new()),
1652a1d56debSopenharmony_ci            JsonValue::new_object(Object::new())
1653a1d56debSopenharmony_ci        );
1654a1d56debSopenharmony_ci        assert_ne!(JsonValue::new_null(), JsonValue::new_boolean(true));
1655a1d56debSopenharmony_ci    }
1656a1d56debSopenharmony_ci
1657a1d56debSopenharmony_ci    /// UT test for `JsonValue::from`.
1658a1d56debSopenharmony_ci    ///
1659a1d56debSopenharmony_ci    /// # Title
1660a1d56debSopenharmony_ci    /// ut_json_value_from
1661a1d56debSopenharmony_ci    ///
1662a1d56debSopenharmony_ci    /// # Brief
1663a1d56debSopenharmony_ci    /// 1. Calls `JsonValue::from` to create `JsonValue`s.
1664a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1665a1d56debSopenharmony_ci    #[test]
1666a1d56debSopenharmony_ci    fn ut_json_value_from() {
1667a1d56debSopenharmony_ci        assert_eq!(JsonValue::from(true), JsonValue::new_boolean(true));
1668a1d56debSopenharmony_ci        assert_eq!(JsonValue::from(false), JsonValue::new_boolean(false));
1669a1d56debSopenharmony_ci        assert_eq!(
1670a1d56debSopenharmony_ci            JsonValue::from(Array::new()),
1671a1d56debSopenharmony_ci            JsonValue::new_array(Array::new())
1672a1d56debSopenharmony_ci        );
1673a1d56debSopenharmony_ci        assert_eq!(
1674a1d56debSopenharmony_ci            JsonValue::from(Object::new()),
1675a1d56debSopenharmony_ci            JsonValue::new_object(Object::new())
1676a1d56debSopenharmony_ci        );
1677a1d56debSopenharmony_ci
1678a1d56debSopenharmony_ci        assert_eq!(JsonValue::from(&true), JsonValue::new_boolean(true));
1679a1d56debSopenharmony_ci        assert_eq!(JsonValue::from(&false), JsonValue::new_boolean(false));
1680a1d56debSopenharmony_ci        assert_eq!(
1681a1d56debSopenharmony_ci            JsonValue::from(&Array::new()),
1682a1d56debSopenharmony_ci            JsonValue::new_array(Array::new())
1683a1d56debSopenharmony_ci        );
1684a1d56debSopenharmony_ci        assert_eq!(
1685a1d56debSopenharmony_ci            JsonValue::from(&Object::new()),
1686a1d56debSopenharmony_ci            JsonValue::new_object(Object::new())
1687a1d56debSopenharmony_ci        );
1688a1d56debSopenharmony_ci
1689a1d56debSopenharmony_ci        assert_eq!(JsonValue::from(&mut true), JsonValue::new_boolean(true));
1690a1d56debSopenharmony_ci        assert_eq!(JsonValue::from(&mut false), JsonValue::new_boolean(false));
1691a1d56debSopenharmony_ci        assert_eq!(
1692a1d56debSopenharmony_ci            JsonValue::from(&mut Array::new()),
1693a1d56debSopenharmony_ci            JsonValue::new_array(Array::new())
1694a1d56debSopenharmony_ci        );
1695a1d56debSopenharmony_ci        assert_eq!(
1696a1d56debSopenharmony_ci            JsonValue::from(&mut Object::new()),
1697a1d56debSopenharmony_ci            JsonValue::new_object(Object::new())
1698a1d56debSopenharmony_ci        );
1699a1d56debSopenharmony_ci
1700a1d56debSopenharmony_ci        #[cfg(not(feature = "c_adapter"))]
1701a1d56debSopenharmony_ci        assert_eq!(JsonValue::from(String::new()), JsonValue::new_string(""));
1702a1d56debSopenharmony_ci
1703a1d56debSopenharmony_ci        #[cfg(feature = "c_adapter")]
1704a1d56debSopenharmony_ci        {
1705a1d56debSopenharmony_ci            use std::ffi::CString;
1706a1d56debSopenharmony_ci            assert_eq!(
1707a1d56debSopenharmony_ci                JsonValue::from(CString::new("").unwrap()),
1708a1d56debSopenharmony_ci                JsonValue::new_string("")
1709a1d56debSopenharmony_ci            );
1710a1d56debSopenharmony_ci        }
1711a1d56debSopenharmony_ci    }
1712a1d56debSopenharmony_ci
1713a1d56debSopenharmony_ci    /// UT test for `JsonValue::remove`.
1714a1d56debSopenharmony_ci    ///
1715a1d56debSopenharmony_ci    /// # Title
1716a1d56debSopenharmony_ci    /// ut_json_value_remove
1717a1d56debSopenharmony_ci    ///
1718a1d56debSopenharmony_ci    /// # Brief
1719a1d56debSopenharmony_ci    /// 1. Creates some `JsonValue`.
1720a1d56debSopenharmony_ci    /// 2. Calls `JsonValue::remove` on them.
1721a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
1722a1d56debSopenharmony_ci    #[test]
1723a1d56debSopenharmony_ci    fn ut_json_value_remove() {
1724a1d56debSopenharmony_ci        let mut object = JsonValue::new_object(
1725a1d56debSopenharmony_ci            object!("key1" => "value1"; "key2" => "value2"; "key3" => "value3"),
1726a1d56debSopenharmony_ci        );
1727a1d56debSopenharmony_ci        assert_eq!(object["key1"], JsonValue::new_string("value1"));
1728a1d56debSopenharmony_ci        assert_eq!(object["key2"], JsonValue::new_string("value2"));
1729a1d56debSopenharmony_ci        assert_eq!(object["key3"], JsonValue::new_string("value3"));
1730a1d56debSopenharmony_ci
1731a1d56debSopenharmony_ci        object.remove("key2");
1732a1d56debSopenharmony_ci        assert_eq!(object["key1"], JsonValue::new_string("value1"));
1733a1d56debSopenharmony_ci        assert_eq!(object["key2"], JsonValue::new_null());
1734a1d56debSopenharmony_ci        assert_eq!(object["key3"], JsonValue::new_string("value3"));
1735a1d56debSopenharmony_ci
1736a1d56debSopenharmony_ci        let mut array = JsonValue::new_array(array!(false, JsonValue::new_null(), 12.34));
1737a1d56debSopenharmony_ci        assert_eq!(array[0], JsonValue::new_boolean(false));
1738a1d56debSopenharmony_ci        assert_eq!(array[1], JsonValue::new_null());
1739a1d56debSopenharmony_ci        assert_eq!(array[2], JsonValue::new_number(12.34.into()));
1740a1d56debSopenharmony_ci
1741a1d56debSopenharmony_ci        array.remove(1);
1742a1d56debSopenharmony_ci        assert_eq!(array[0], JsonValue::new_boolean(false));
1743a1d56debSopenharmony_ci        assert_eq!(array[1], JsonValue::new_number(12.34.into()));
1744a1d56debSopenharmony_ci        assert_eq!(array[2], JsonValue::new_null());
1745a1d56debSopenharmony_ci    }
1746a1d56debSopenharmony_ci
1747a1d56debSopenharmony_ci    /// UT test for `JsonValue::from_reader`.
1748a1d56debSopenharmony_ci    ///
1749a1d56debSopenharmony_ci    /// # Title
1750a1d56debSopenharmony_ci    /// ut_json_value_from_reader
1751a1d56debSopenharmony_ci    ///
1752a1d56debSopenharmony_ci    /// # Brief
1753a1d56debSopenharmony_ci    /// 1. Calls `JsonValue::from_reader` to create some `JsonValue`.
1754a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1755a1d56debSopenharmony_ci    #[test]
1756a1d56debSopenharmony_ci    fn ut_json_value_from_reader() {
1757a1d56debSopenharmony_ci        struct TestErrorIo;
1758a1d56debSopenharmony_ci
1759a1d56debSopenharmony_ci        impl Read for TestErrorIo {
1760a1d56debSopenharmony_ci            fn read(&mut self, _buf: &mut [u8]) -> Result<usize> {
1761a1d56debSopenharmony_ci                Err(ErrorKind::AddrInUse.into())
1762a1d56debSopenharmony_ci            }
1763a1d56debSopenharmony_ci        }
1764a1d56debSopenharmony_ci
1765a1d56debSopenharmony_ci        assert!(JsonValue::from_reader(TestErrorIo).is_err());
1766a1d56debSopenharmony_ci    }
1767a1d56debSopenharmony_ci}
1768