1a1d56debSopenharmony_ci// Copyright (c) 2023 Huawei Device Co., Ltd.
2a1d56debSopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
3a1d56debSopenharmony_ci// you may not use this file except in compliance with the License.
4a1d56debSopenharmony_ci// You may obtain a copy of the License at
5a1d56debSopenharmony_ci//
6a1d56debSopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
7a1d56debSopenharmony_ci//
8a1d56debSopenharmony_ci// Unless required by applicable law or agreed to in writing, software
9a1d56debSopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
10a1d56debSopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11a1d56debSopenharmony_ci// See the License for the specific language governing permissions and
12a1d56debSopenharmony_ci// limitations under the License.
13a1d56debSopenharmony_ci
14a1d56debSopenharmony_ciuse crate::reader::{BytesReader, Cacheable, IoReader, SliceReader};
15a1d56debSopenharmony_ciuse serde::de;
16a1d56debSopenharmony_ciuse serde::de::{
17a1d56debSopenharmony_ci    DeserializeOwned, DeserializeSeed, EnumAccess, IntoDeserializer, MapAccess, SeqAccess,
18a1d56debSopenharmony_ci    VariantAccess, Visitor,
19a1d56debSopenharmony_ci};
20a1d56debSopenharmony_ciuse serde::Deserialize;
21a1d56debSopenharmony_ciuse std::io::Read;
22a1d56debSopenharmony_ci
23a1d56debSopenharmony_ciuse crate::{consts::*, error::*, states::*, Number, ParseError::*};
24a1d56debSopenharmony_ci
25a1d56debSopenharmony_ci#[cfg(feature = "c_adapter")]
26a1d56debSopenharmony_citype JsonString = CString;
27a1d56debSopenharmony_ci#[cfg(not(feature = "c_adapter"))]
28a1d56debSopenharmony_citype JsonString = String;
29a1d56debSopenharmony_ci
30a1d56debSopenharmony_ciimpl Number {
31a1d56debSopenharmony_ci    fn visit<'de, V>(self, visitor: V) -> Result<V::Value, Error>
32a1d56debSopenharmony_ci    where
33a1d56debSopenharmony_ci        V: Visitor<'de>,
34a1d56debSopenharmony_ci    {
35a1d56debSopenharmony_ci        match self {
36a1d56debSopenharmony_ci            Number::Unsigned(x) => visitor.visit_u64(x),
37a1d56debSopenharmony_ci            Number::Signed(x) => visitor.visit_i64(x),
38a1d56debSopenharmony_ci            Number::Float(x) => visitor.visit_f64(x),
39a1d56debSopenharmony_ci        }
40a1d56debSopenharmony_ci    }
41a1d56debSopenharmony_ci}
42a1d56debSopenharmony_ci
43a1d56debSopenharmony_ci/// A struct that can deserialize JSON into Rust values of user's types.
44a1d56debSopenharmony_cipub(crate) struct Deserializer<R>
45a1d56debSopenharmony_ciwhere
46a1d56debSopenharmony_ci    R: BytesReader + Cacheable,
47a1d56debSopenharmony_ci{
48a1d56debSopenharmony_ci    pub(crate) reader: R,
49a1d56debSopenharmony_ci    pub(crate) recursion_depth: u32,
50a1d56debSopenharmony_ci}
51a1d56debSopenharmony_ci
52a1d56debSopenharmony_ciimpl<R> Deserializer<R>
53a1d56debSopenharmony_ciwhere
54a1d56debSopenharmony_ci    R: BytesReader + Cacheable,
55a1d56debSopenharmony_ci{
56a1d56debSopenharmony_ci    /// Creates a new instance of Deserializer.
57a1d56debSopenharmony_ci    /// This method is usually used in the following methods:
58a1d56debSopenharmony_ci    /// - Deserializer::new_from_reader
59a1d56debSopenharmony_ci    /// - Deserializer::new_from_slice
60a1d56debSopenharmony_ci    pub fn new(reader: R) -> Self {
61a1d56debSopenharmony_ci        Deserializer {
62a1d56debSopenharmony_ci            reader,
63a1d56debSopenharmony_ci            recursion_depth: 0,
64a1d56debSopenharmony_ci        }
65a1d56debSopenharmony_ci    }
66a1d56debSopenharmony_ci}
67a1d56debSopenharmony_ci
68a1d56debSopenharmony_ci/// Creates an instance of Deserializer from reader.
69a1d56debSopenharmony_ciimpl<R: Read> Deserializer<IoReader<R>> {
70a1d56debSopenharmony_ci    pub fn new_from_io(reader: R) -> Self {
71a1d56debSopenharmony_ci        Deserializer::new(IoReader::new(reader))
72a1d56debSopenharmony_ci    }
73a1d56debSopenharmony_ci}
74a1d56debSopenharmony_ci
75a1d56debSopenharmony_ci/// Creates an instance of Deserializer from slice.
76a1d56debSopenharmony_ciimpl<'a> Deserializer<SliceReader<'a>> {
77a1d56debSopenharmony_ci    pub fn new_from_slice(slice: &'a [u8]) -> Self {
78a1d56debSopenharmony_ci        Deserializer::new(SliceReader::new(slice))
79a1d56debSopenharmony_ci    }
80a1d56debSopenharmony_ci}
81a1d56debSopenharmony_ci
82a1d56debSopenharmony_ci/// Deserializes an instance of type `T` from an IO stream of JSON.
83a1d56debSopenharmony_ci/// # Example
84a1d56debSopenharmony_ci/// ```not run
85a1d56debSopenharmony_ci/// use serde::Deserialize;
86a1d56debSopenharmony_ci/// use std::fs::File;
87a1d56debSopenharmony_ci/// use ylong_json::from_reader;
88a1d56debSopenharmony_ci///
89a1d56debSopenharmony_ci/// #[derive(Deserialize, PartialEq, Debug)]
90a1d56debSopenharmony_ci/// struct Test {
91a1d56debSopenharmony_ci///     int: u32,
92a1d56debSopenharmony_ci///     seq: Vec<String>,
93a1d56debSopenharmony_ci///     tup: (i32, i32, i32),
94a1d56debSopenharmony_ci/// }
95a1d56debSopenharmony_ci///
96a1d56debSopenharmony_ci/// let expected = Test {
97a1d56debSopenharmony_ci///     int: 1,
98a1d56debSopenharmony_ci///     seq: vec![String::from("abcd"), String::from("efgh")],
99a1d56debSopenharmony_ci///     tup: (1, 2, 3),
100a1d56debSopenharmony_ci/// };
101a1d56debSopenharmony_ci/// let file = File::open("./test.txt").unwrap();
102a1d56debSopenharmony_ci/// assert_eq!(expected, from_reader(file).unwrap());
103a1d56debSopenharmony_ci/// ```
104a1d56debSopenharmony_cipub fn from_reader<R, T>(reader: R) -> Result<T, Error>
105a1d56debSopenharmony_ciwhere
106a1d56debSopenharmony_ci    R: Read,
107a1d56debSopenharmony_ci    T: DeserializeOwned,
108a1d56debSopenharmony_ci{
109a1d56debSopenharmony_ci    let mut deserializer = Deserializer::new_from_io(reader);
110a1d56debSopenharmony_ci    let t = T::deserialize(&mut deserializer)?;
111a1d56debSopenharmony_ci    match eat_whitespace_until_not!(deserializer) {
112a1d56debSopenharmony_ci        None => Ok(t),
113a1d56debSopenharmony_ci        _ => Err(Error::Parsing(ParsingUnfinished)),
114a1d56debSopenharmony_ci    }
115a1d56debSopenharmony_ci}
116a1d56debSopenharmony_ci
117a1d56debSopenharmony_ci/// Deserializes an instance of type `T` from bytes.
118a1d56debSopenharmony_ci/// # Example
119a1d56debSopenharmony_ci/// ```
120a1d56debSopenharmony_ci/// use serde::Deserialize;
121a1d56debSopenharmony_ci/// use ylong_json::from_slice;
122a1d56debSopenharmony_ci///
123a1d56debSopenharmony_ci/// #[derive(Deserialize, PartialEq, Debug)]
124a1d56debSopenharmony_ci/// struct Test {
125a1d56debSopenharmony_ci///     int: u32,
126a1d56debSopenharmony_ci///     seq: Vec<String>,
127a1d56debSopenharmony_ci///     tup: (i32, i32, i32),
128a1d56debSopenharmony_ci/// }
129a1d56debSopenharmony_ci///
130a1d56debSopenharmony_ci/// let slice = r#"{"int":1,"seq":["abcd","efgh"],"tup":[1,2,3]}"#.as_bytes();
131a1d56debSopenharmony_ci/// let expected = Test {
132a1d56debSopenharmony_ci///     int: 1,
133a1d56debSopenharmony_ci///     seq: vec![String::from("abcd"), String::from("efgh")],
134a1d56debSopenharmony_ci///     tup: (1, 2, 3),
135a1d56debSopenharmony_ci/// };
136a1d56debSopenharmony_ci/// assert_eq!(expected, from_slice(slice).unwrap())
137a1d56debSopenharmony_ci/// ```
138a1d56debSopenharmony_cipub fn from_slice<'a, T>(slice: &'a [u8]) -> Result<T, Error>
139a1d56debSopenharmony_ciwhere
140a1d56debSopenharmony_ci    T: Deserialize<'a>,
141a1d56debSopenharmony_ci{
142a1d56debSopenharmony_ci    let mut deserializer = Deserializer::new_from_slice(slice);
143a1d56debSopenharmony_ci    let t = T::deserialize(&mut deserializer)?;
144a1d56debSopenharmony_ci    match eat_whitespace_until_not!(deserializer) {
145a1d56debSopenharmony_ci        None => Ok(t),
146a1d56debSopenharmony_ci        _ => {
147a1d56debSopenharmony_ci            unexpected_character!(&mut deserializer)
148a1d56debSopenharmony_ci        }
149a1d56debSopenharmony_ci    }
150a1d56debSopenharmony_ci}
151a1d56debSopenharmony_ci
152a1d56debSopenharmony_ci/// Deserializes an instance of type `T` from str.
153a1d56debSopenharmony_ci/// # Example
154a1d56debSopenharmony_ci/// ```
155a1d56debSopenharmony_ci/// use serde::Deserialize;
156a1d56debSopenharmony_ci/// use ylong_json::from_str;
157a1d56debSopenharmony_ci///
158a1d56debSopenharmony_ci/// #[derive(Deserialize, PartialEq, Debug)]
159a1d56debSopenharmony_ci/// struct Test {
160a1d56debSopenharmony_ci///     int: u32,
161a1d56debSopenharmony_ci///     seq: Vec<String>,
162a1d56debSopenharmony_ci///     tup: (i32, i32, i32),
163a1d56debSopenharmony_ci/// }
164a1d56debSopenharmony_ci///
165a1d56debSopenharmony_ci/// let str = r#"{"int":1,"seq":["abcd","efgh"],"tup":[1,2,3]}"#;
166a1d56debSopenharmony_ci/// let expected = Test {
167a1d56debSopenharmony_ci///     int: 1,
168a1d56debSopenharmony_ci///     seq: vec![String::from("abcd"), String::from("efgh")],
169a1d56debSopenharmony_ci///     tup: (1, 2, 3),
170a1d56debSopenharmony_ci/// };
171a1d56debSopenharmony_ci/// assert_eq!(expected, from_str(str).unwrap())
172a1d56debSopenharmony_ci/// ```
173a1d56debSopenharmony_cipub fn from_str<'a, T>(str: &'a str) -> Result<T, Error>
174a1d56debSopenharmony_ciwhere
175a1d56debSopenharmony_ci    T: Deserialize<'a>,
176a1d56debSopenharmony_ci{
177a1d56debSopenharmony_ci    from_slice(str.as_bytes())
178a1d56debSopenharmony_ci}
179a1d56debSopenharmony_ci
180a1d56debSopenharmony_ciimpl<R> Deserializer<R>
181a1d56debSopenharmony_ciwhere
182a1d56debSopenharmony_ci    R: BytesReader + Cacheable,
183a1d56debSopenharmony_ci{
184a1d56debSopenharmony_ci    // Look at the next character without moving cursor.
185a1d56debSopenharmony_ci    fn peek_char(&mut self) -> Result<Option<u8>, Error> {
186a1d56debSopenharmony_ci        self.reader.peek().map_err(Error::new_reader)
187a1d56debSopenharmony_ci    }
188a1d56debSopenharmony_ci
189a1d56debSopenharmony_ci    // Get the next character and move the cursor to the next place.
190a1d56debSopenharmony_ci    fn next_char(&mut self) -> Result<Option<u8>, Error> {
191a1d56debSopenharmony_ci        self.reader.next().map_err(Error::new_reader)
192a1d56debSopenharmony_ci    }
193a1d56debSopenharmony_ci
194a1d56debSopenharmony_ci    // Discard the next character and move the cursor to the next place.
195a1d56debSopenharmony_ci    fn discard_char(&mut self) {
196a1d56debSopenharmony_ci        self.reader.discard();
197a1d56debSopenharmony_ci    }
198a1d56debSopenharmony_ci
199a1d56debSopenharmony_ci    // Parse value of bool, `true` or `false`.
200a1d56debSopenharmony_ci    fn parse_bool(&mut self) -> Result<bool, Error> {
201a1d56debSopenharmony_ci        let peek_ch = match eat_whitespace_until_not!(self) {
202a1d56debSopenharmony_ci            Some(ch) => ch,
203a1d56debSopenharmony_ci            None => {
204a1d56debSopenharmony_ci                return Err(Error::Parsing(ParsingUnfinished));
205a1d56debSopenharmony_ci            }
206a1d56debSopenharmony_ci        };
207a1d56debSopenharmony_ci
208a1d56debSopenharmony_ci        match peek_ch {
209a1d56debSopenharmony_ci            b't' => {
210a1d56debSopenharmony_ci                self.reader.discard();
211a1d56debSopenharmony_ci                match_str!(self, b"rue");
212a1d56debSopenharmony_ci                Ok(true)
213a1d56debSopenharmony_ci            }
214a1d56debSopenharmony_ci            b'f' => {
215a1d56debSopenharmony_ci                self.reader.discard();
216a1d56debSopenharmony_ci                match_str!(self, b"alse");
217a1d56debSopenharmony_ci                Ok(false)
218a1d56debSopenharmony_ci            }
219a1d56debSopenharmony_ci            _ => {
220a1d56debSopenharmony_ci                unexpected_character!(self)
221a1d56debSopenharmony_ci            }
222a1d56debSopenharmony_ci        }
223a1d56debSopenharmony_ci    }
224a1d56debSopenharmony_ci
225a1d56debSopenharmony_ci    fn de_parse_number<'de, V>(&mut self, visitor: V) -> Result<V::Value, Error>
226a1d56debSopenharmony_ci    where
227a1d56debSopenharmony_ci        V: Visitor<'de>,
228a1d56debSopenharmony_ci    {
229a1d56debSopenharmony_ci        let peek_ch = match eat_whitespace_until_not!(self) {
230a1d56debSopenharmony_ci            Some(ch) => ch,
231a1d56debSopenharmony_ci            None => {
232a1d56debSopenharmony_ci                return Err(Error::Parsing(ParsingUnfinished));
233a1d56debSopenharmony_ci            }
234a1d56debSopenharmony_ci        };
235a1d56debSopenharmony_ci
236a1d56debSopenharmony_ci        match peek_ch {
237a1d56debSopenharmony_ci            b'-' => parse_number(self)?.visit(visitor),
238a1d56debSopenharmony_ci            b'0'..=b'9' => parse_number(self)?.visit(visitor),
239a1d56debSopenharmony_ci            _ => unexpected_character!(self),
240a1d56debSopenharmony_ci        }
241a1d56debSopenharmony_ci    }
242a1d56debSopenharmony_ci
243a1d56debSopenharmony_ci    fn de_parse_string(&mut self) -> Result<JsonString, Error> {
244a1d56debSopenharmony_ci        match self.peek_char()? {
245a1d56debSopenharmony_ci            Some(b'"') => self.discard_char(),
246a1d56debSopenharmony_ci            _ => return unexpected_character!(self),
247a1d56debSopenharmony_ci        }
248a1d56debSopenharmony_ci        parse_string(self)
249a1d56debSopenharmony_ci    }
250a1d56debSopenharmony_ci}
251a1d56debSopenharmony_ci
252a1d56debSopenharmony_ciimpl<'de, 'a, R> de::Deserializer<'de> for &'a mut Deserializer<R>
253a1d56debSopenharmony_ciwhere
254a1d56debSopenharmony_ci    R: BytesReader + Cacheable,
255a1d56debSopenharmony_ci{
256a1d56debSopenharmony_ci    type Error = Error;
257a1d56debSopenharmony_ci
258a1d56debSopenharmony_ci    // Choose a parsing method to parse value based on the input data.
259a1d56debSopenharmony_ci    fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
260a1d56debSopenharmony_ci    where
261a1d56debSopenharmony_ci        V: Visitor<'de>,
262a1d56debSopenharmony_ci    {
263a1d56debSopenharmony_ci        let peek_ch = match eat_whitespace_until_not!(self) {
264a1d56debSopenharmony_ci            Some(ch) => ch,
265a1d56debSopenharmony_ci            None => {
266a1d56debSopenharmony_ci                return Err(Error::Parsing(ParsingUnfinished));
267a1d56debSopenharmony_ci            }
268a1d56debSopenharmony_ci        };
269a1d56debSopenharmony_ci
270a1d56debSopenharmony_ci        match peek_ch {
271a1d56debSopenharmony_ci            b'n' => self.deserialize_unit(visitor),
272a1d56debSopenharmony_ci            b't' | b'f' => self.deserialize_bool(visitor),
273a1d56debSopenharmony_ci            b'"' => self.deserialize_str(visitor),
274a1d56debSopenharmony_ci            b'0'..=b'9' => self.deserialize_u64(visitor),
275a1d56debSopenharmony_ci            b'-' => self.deserialize_i64(visitor),
276a1d56debSopenharmony_ci            b'[' => self.deserialize_seq(visitor),
277a1d56debSopenharmony_ci            b'{' => self.deserialize_map(visitor),
278a1d56debSopenharmony_ci            _ => unexpected_character!(self),
279a1d56debSopenharmony_ci        }
280a1d56debSopenharmony_ci    }
281a1d56debSopenharmony_ci
282a1d56debSopenharmony_ci    fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
283a1d56debSopenharmony_ci    where
284a1d56debSopenharmony_ci        V: Visitor<'de>,
285a1d56debSopenharmony_ci    {
286a1d56debSopenharmony_ci        visitor.visit_bool(self.parse_bool()?)
287a1d56debSopenharmony_ci    }
288a1d56debSopenharmony_ci
289a1d56debSopenharmony_ci    fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
290a1d56debSopenharmony_ci    where
291a1d56debSopenharmony_ci        V: Visitor<'de>,
292a1d56debSopenharmony_ci    {
293a1d56debSopenharmony_ci        self.de_parse_number(visitor)
294a1d56debSopenharmony_ci    }
295a1d56debSopenharmony_ci
296a1d56debSopenharmony_ci    fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
297a1d56debSopenharmony_ci    where
298a1d56debSopenharmony_ci        V: Visitor<'de>,
299a1d56debSopenharmony_ci    {
300a1d56debSopenharmony_ci        self.de_parse_number(visitor)
301a1d56debSopenharmony_ci    }
302a1d56debSopenharmony_ci
303a1d56debSopenharmony_ci    fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
304a1d56debSopenharmony_ci    where
305a1d56debSopenharmony_ci        V: Visitor<'de>,
306a1d56debSopenharmony_ci    {
307a1d56debSopenharmony_ci        self.de_parse_number(visitor)
308a1d56debSopenharmony_ci    }
309a1d56debSopenharmony_ci
310a1d56debSopenharmony_ci    fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
311a1d56debSopenharmony_ci    where
312a1d56debSopenharmony_ci        V: Visitor<'de>,
313a1d56debSopenharmony_ci    {
314a1d56debSopenharmony_ci        self.de_parse_number(visitor)
315a1d56debSopenharmony_ci    }
316a1d56debSopenharmony_ci
317a1d56debSopenharmony_ci    fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
318a1d56debSopenharmony_ci    where
319a1d56debSopenharmony_ci        V: Visitor<'de>,
320a1d56debSopenharmony_ci    {
321a1d56debSopenharmony_ci        self.de_parse_number(visitor)
322a1d56debSopenharmony_ci    }
323a1d56debSopenharmony_ci
324a1d56debSopenharmony_ci    fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
325a1d56debSopenharmony_ci    where
326a1d56debSopenharmony_ci        V: Visitor<'de>,
327a1d56debSopenharmony_ci    {
328a1d56debSopenharmony_ci        self.de_parse_number(visitor)
329a1d56debSopenharmony_ci    }
330a1d56debSopenharmony_ci
331a1d56debSopenharmony_ci    fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
332a1d56debSopenharmony_ci    where
333a1d56debSopenharmony_ci        V: Visitor<'de>,
334a1d56debSopenharmony_ci    {
335a1d56debSopenharmony_ci        self.de_parse_number(visitor)
336a1d56debSopenharmony_ci    }
337a1d56debSopenharmony_ci
338a1d56debSopenharmony_ci    fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
339a1d56debSopenharmony_ci    where
340a1d56debSopenharmony_ci        V: Visitor<'de>,
341a1d56debSopenharmony_ci    {
342a1d56debSopenharmony_ci        self.de_parse_number(visitor)
343a1d56debSopenharmony_ci    }
344a1d56debSopenharmony_ci
345a1d56debSopenharmony_ci    fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
346a1d56debSopenharmony_ci    where
347a1d56debSopenharmony_ci        V: Visitor<'de>,
348a1d56debSopenharmony_ci    {
349a1d56debSopenharmony_ci        self.de_parse_number(visitor)
350a1d56debSopenharmony_ci    }
351a1d56debSopenharmony_ci
352a1d56debSopenharmony_ci    fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
353a1d56debSopenharmony_ci    where
354a1d56debSopenharmony_ci        V: Visitor<'de>,
355a1d56debSopenharmony_ci    {
356a1d56debSopenharmony_ci        self.de_parse_number(visitor)
357a1d56debSopenharmony_ci    }
358a1d56debSopenharmony_ci
359a1d56debSopenharmony_ci    fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
360a1d56debSopenharmony_ci    where
361a1d56debSopenharmony_ci        V: Visitor<'de>,
362a1d56debSopenharmony_ci    {
363a1d56debSopenharmony_ci        self.deserialize_str(visitor)
364a1d56debSopenharmony_ci    }
365a1d56debSopenharmony_ci
366a1d56debSopenharmony_ci    fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
367a1d56debSopenharmony_ci    where
368a1d56debSopenharmony_ci        V: Visitor<'de>,
369a1d56debSopenharmony_ci    {
370a1d56debSopenharmony_ci        let str = self.de_parse_string()?;
371a1d56debSopenharmony_ci        #[cfg(feature = "c_adapter")]
372a1d56debSopenharmony_ci        return visitor.visit_str(str.to_str()?);
373a1d56debSopenharmony_ci
374a1d56debSopenharmony_ci        #[cfg(not(feature = "c_adapter"))]
375a1d56debSopenharmony_ci        visitor.visit_str(str.as_str())
376a1d56debSopenharmony_ci    }
377a1d56debSopenharmony_ci
378a1d56debSopenharmony_ci    fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
379a1d56debSopenharmony_ci    where
380a1d56debSopenharmony_ci        V: Visitor<'de>,
381a1d56debSopenharmony_ci    {
382a1d56debSopenharmony_ci        self.deserialize_str(visitor)
383a1d56debSopenharmony_ci    }
384a1d56debSopenharmony_ci
385a1d56debSopenharmony_ci    fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
386a1d56debSopenharmony_ci    where
387a1d56debSopenharmony_ci        V: Visitor<'de>,
388a1d56debSopenharmony_ci    {
389a1d56debSopenharmony_ci        let peek_ch = match eat_whitespace_until_not!(self) {
390a1d56debSopenharmony_ci            Some(ch) => ch,
391a1d56debSopenharmony_ci            None => {
392a1d56debSopenharmony_ci                return Err(Error::Parsing(ParsingUnfinished));
393a1d56debSopenharmony_ci            }
394a1d56debSopenharmony_ci        };
395a1d56debSopenharmony_ci
396a1d56debSopenharmony_ci        match peek_ch {
397a1d56debSopenharmony_ci            b'"' => {
398a1d56debSopenharmony_ci                let v = parse_string_inner(self)?;
399a1d56debSopenharmony_ci                visitor.visit_bytes(&v)
400a1d56debSopenharmony_ci            }
401a1d56debSopenharmony_ci            b'[' => self.deserialize_seq(visitor),
402a1d56debSopenharmony_ci            _ => unexpected_character!(self),
403a1d56debSopenharmony_ci        }
404a1d56debSopenharmony_ci    }
405a1d56debSopenharmony_ci
406a1d56debSopenharmony_ci    fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
407a1d56debSopenharmony_ci    where
408a1d56debSopenharmony_ci        V: Visitor<'de>,
409a1d56debSopenharmony_ci    {
410a1d56debSopenharmony_ci        self.deserialize_bytes(visitor)
411a1d56debSopenharmony_ci    }
412a1d56debSopenharmony_ci
413a1d56debSopenharmony_ci    fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
414a1d56debSopenharmony_ci    where
415a1d56debSopenharmony_ci        V: Visitor<'de>,
416a1d56debSopenharmony_ci    {
417a1d56debSopenharmony_ci        let peek_ch = match eat_whitespace_until_not!(self) {
418a1d56debSopenharmony_ci            Some(ch) => ch,
419a1d56debSopenharmony_ci            None => {
420a1d56debSopenharmony_ci                return Err(Error::Parsing(ParsingUnfinished));
421a1d56debSopenharmony_ci            }
422a1d56debSopenharmony_ci        };
423a1d56debSopenharmony_ci
424a1d56debSopenharmony_ci        match peek_ch {
425a1d56debSopenharmony_ci            b'n' => {
426a1d56debSopenharmony_ci                self.discard_char();
427a1d56debSopenharmony_ci                match_str!(self, b"ull");
428a1d56debSopenharmony_ci                visitor.visit_none()
429a1d56debSopenharmony_ci            }
430a1d56debSopenharmony_ci            _ => visitor.visit_some(self),
431a1d56debSopenharmony_ci        }
432a1d56debSopenharmony_ci    }
433a1d56debSopenharmony_ci
434a1d56debSopenharmony_ci    fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
435a1d56debSopenharmony_ci    where
436a1d56debSopenharmony_ci        V: Visitor<'de>,
437a1d56debSopenharmony_ci    {
438a1d56debSopenharmony_ci        let peek_ch = match eat_whitespace_until_not!(self) {
439a1d56debSopenharmony_ci            Some(ch) => ch,
440a1d56debSopenharmony_ci            None => {
441a1d56debSopenharmony_ci                return Err(Error::Parsing(ParsingUnfinished));
442a1d56debSopenharmony_ci            }
443a1d56debSopenharmony_ci        };
444a1d56debSopenharmony_ci
445a1d56debSopenharmony_ci        match peek_ch {
446a1d56debSopenharmony_ci            b'n' => {
447a1d56debSopenharmony_ci                self.discard_char();
448a1d56debSopenharmony_ci                match_str!(self, b"ull");
449a1d56debSopenharmony_ci                visitor.visit_unit()
450a1d56debSopenharmony_ci            }
451a1d56debSopenharmony_ci            _ => unexpected_character!(self),
452a1d56debSopenharmony_ci        }
453a1d56debSopenharmony_ci    }
454a1d56debSopenharmony_ci
455a1d56debSopenharmony_ci    fn deserialize_unit_struct<V>(
456a1d56debSopenharmony_ci        self,
457a1d56debSopenharmony_ci        _name: &'static str,
458a1d56debSopenharmony_ci        visitor: V,
459a1d56debSopenharmony_ci    ) -> Result<V::Value, Self::Error>
460a1d56debSopenharmony_ci    where
461a1d56debSopenharmony_ci        V: Visitor<'de>,
462a1d56debSopenharmony_ci    {
463a1d56debSopenharmony_ci        self.deserialize_unit(visitor)
464a1d56debSopenharmony_ci    }
465a1d56debSopenharmony_ci
466a1d56debSopenharmony_ci    fn deserialize_newtype_struct<V>(
467a1d56debSopenharmony_ci        self,
468a1d56debSopenharmony_ci        _name: &'static str,
469a1d56debSopenharmony_ci        visitor: V,
470a1d56debSopenharmony_ci    ) -> Result<V::Value, Self::Error>
471a1d56debSopenharmony_ci    where
472a1d56debSopenharmony_ci        V: Visitor<'de>,
473a1d56debSopenharmony_ci    {
474a1d56debSopenharmony_ci        visitor.visit_newtype_struct(self)
475a1d56debSopenharmony_ci    }
476a1d56debSopenharmony_ci
477a1d56debSopenharmony_ci    fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
478a1d56debSopenharmony_ci    where
479a1d56debSopenharmony_ci        V: Visitor<'de>,
480a1d56debSopenharmony_ci    {
481a1d56debSopenharmony_ci        let peek_ch = match eat_whitespace_until_not!(self) {
482a1d56debSopenharmony_ci            Some(ch) => ch,
483a1d56debSopenharmony_ci            None => {
484a1d56debSopenharmony_ci                return Err(Error::Parsing(ParsingUnfinished));
485a1d56debSopenharmony_ci            }
486a1d56debSopenharmony_ci        };
487a1d56debSopenharmony_ci
488a1d56debSopenharmony_ci        match peek_ch {
489a1d56debSopenharmony_ci            b'[' => {
490a1d56debSopenharmony_ci                self.discard_char();
491a1d56debSopenharmony_ci                let value = visitor.visit_seq(SeqAssistant::new(self))?;
492a1d56debSopenharmony_ci
493a1d56debSopenharmony_ci                let peek_ch_inner = match eat_whitespace_until_not!(self) {
494a1d56debSopenharmony_ci                    Some(ch) => ch,
495a1d56debSopenharmony_ci                    None => {
496a1d56debSopenharmony_ci                        return Err(Error::Parsing(ParsingUnfinished));
497a1d56debSopenharmony_ci                    }
498a1d56debSopenharmony_ci                };
499a1d56debSopenharmony_ci
500a1d56debSopenharmony_ci                match peek_ch_inner {
501a1d56debSopenharmony_ci                    b']' => {
502a1d56debSopenharmony_ci                        self.discard_char();
503a1d56debSopenharmony_ci                        Ok(value)
504a1d56debSopenharmony_ci                    }
505a1d56debSopenharmony_ci                    _ => unexpected_character!(self),
506a1d56debSopenharmony_ci                }
507a1d56debSopenharmony_ci            }
508a1d56debSopenharmony_ci            _ => unexpected_character!(self),
509a1d56debSopenharmony_ci        }
510a1d56debSopenharmony_ci    }
511a1d56debSopenharmony_ci
512a1d56debSopenharmony_ci    fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
513a1d56debSopenharmony_ci    where
514a1d56debSopenharmony_ci        V: Visitor<'de>,
515a1d56debSopenharmony_ci    {
516a1d56debSopenharmony_ci        self.deserialize_seq(visitor)
517a1d56debSopenharmony_ci    }
518a1d56debSopenharmony_ci
519a1d56debSopenharmony_ci    fn deserialize_tuple_struct<V>(
520a1d56debSopenharmony_ci        self,
521a1d56debSopenharmony_ci        _name: &'static str,
522a1d56debSopenharmony_ci        _len: usize,
523a1d56debSopenharmony_ci        visitor: V,
524a1d56debSopenharmony_ci    ) -> Result<V::Value, Self::Error>
525a1d56debSopenharmony_ci    where
526a1d56debSopenharmony_ci        V: Visitor<'de>,
527a1d56debSopenharmony_ci    {
528a1d56debSopenharmony_ci        self.deserialize_seq(visitor)
529a1d56debSopenharmony_ci    }
530a1d56debSopenharmony_ci
531a1d56debSopenharmony_ci    fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
532a1d56debSopenharmony_ci    where
533a1d56debSopenharmony_ci        V: Visitor<'de>,
534a1d56debSopenharmony_ci    {
535a1d56debSopenharmony_ci        let peek_ch = match eat_whitespace_until_not!(self) {
536a1d56debSopenharmony_ci            Some(ch) => ch,
537a1d56debSopenharmony_ci            None => {
538a1d56debSopenharmony_ci                return Err(Error::Parsing(ParsingUnfinished));
539a1d56debSopenharmony_ci            }
540a1d56debSopenharmony_ci        };
541a1d56debSopenharmony_ci
542a1d56debSopenharmony_ci        match peek_ch {
543a1d56debSopenharmony_ci            b'{' => {
544a1d56debSopenharmony_ci                self.discard_char();
545a1d56debSopenharmony_ci                let value = visitor.visit_map(SeqAssistant::new(self))?;
546a1d56debSopenharmony_ci
547a1d56debSopenharmony_ci                let peek_ch_inner = match eat_whitespace_until_not!(self) {
548a1d56debSopenharmony_ci                    Some(ch) => ch,
549a1d56debSopenharmony_ci                    None => {
550a1d56debSopenharmony_ci                        return Err(Error::Parsing(ParsingUnfinished));
551a1d56debSopenharmony_ci                    }
552a1d56debSopenharmony_ci                };
553a1d56debSopenharmony_ci
554a1d56debSopenharmony_ci                match peek_ch_inner {
555a1d56debSopenharmony_ci                    b'}' => {
556a1d56debSopenharmony_ci                        self.discard_char();
557a1d56debSopenharmony_ci                        Ok(value)
558a1d56debSopenharmony_ci                    }
559a1d56debSopenharmony_ci                    _ => unexpected_character!(self),
560a1d56debSopenharmony_ci                }
561a1d56debSopenharmony_ci            }
562a1d56debSopenharmony_ci            _ => unexpected_character!(self),
563a1d56debSopenharmony_ci        }
564a1d56debSopenharmony_ci    }
565a1d56debSopenharmony_ci
566a1d56debSopenharmony_ci    fn deserialize_struct<V>(
567a1d56debSopenharmony_ci        self,
568a1d56debSopenharmony_ci        _name: &'static str,
569a1d56debSopenharmony_ci        _fields: &'static [&'static str],
570a1d56debSopenharmony_ci        visitor: V,
571a1d56debSopenharmony_ci    ) -> Result<V::Value, Self::Error>
572a1d56debSopenharmony_ci    where
573a1d56debSopenharmony_ci        V: Visitor<'de>,
574a1d56debSopenharmony_ci    {
575a1d56debSopenharmony_ci        self.deserialize_map(visitor)
576a1d56debSopenharmony_ci    }
577a1d56debSopenharmony_ci
578a1d56debSopenharmony_ci    fn deserialize_enum<V>(
579a1d56debSopenharmony_ci        self,
580a1d56debSopenharmony_ci        _name: &'static str,
581a1d56debSopenharmony_ci        _variants: &'static [&'static str],
582a1d56debSopenharmony_ci        visitor: V,
583a1d56debSopenharmony_ci    ) -> Result<V::Value, Self::Error>
584a1d56debSopenharmony_ci    where
585a1d56debSopenharmony_ci        V: Visitor<'de>,
586a1d56debSopenharmony_ci    {
587a1d56debSopenharmony_ci        let peek_ch = match eat_whitespace_until_not!(self) {
588a1d56debSopenharmony_ci            Some(ch) => ch,
589a1d56debSopenharmony_ci            None => {
590a1d56debSopenharmony_ci                return Err(Error::Parsing(ParsingUnfinished));
591a1d56debSopenharmony_ci            }
592a1d56debSopenharmony_ci        };
593a1d56debSopenharmony_ci
594a1d56debSopenharmony_ci        match peek_ch {
595a1d56debSopenharmony_ci            b'"' => {
596a1d56debSopenharmony_ci                #[cfg(feature = "c_adapter")]
597a1d56debSopenharmony_ci                return visitor
598a1d56debSopenharmony_ci                    .visit_enum(self.de_parse_string()?.into_string()?.into_deserializer());
599a1d56debSopenharmony_ci
600a1d56debSopenharmony_ci                #[cfg(not(feature = "c_adapter"))]
601a1d56debSopenharmony_ci                visitor.visit_enum(self.de_parse_string()?.into_deserializer())
602a1d56debSopenharmony_ci            }
603a1d56debSopenharmony_ci            _ => {
604a1d56debSopenharmony_ci                if self.next_char()? == Some(b'{') {
605a1d56debSopenharmony_ci                    eat_whitespace_until_not!(self);
606a1d56debSopenharmony_ci                    let value = visitor.visit_enum(EnumAssistant::new(self))?;
607a1d56debSopenharmony_ci                    eat_whitespace_until_not!(self);
608a1d56debSopenharmony_ci
609a1d56debSopenharmony_ci                    if self.next_char()? == Some(b'}') {
610a1d56debSopenharmony_ci                        Ok(value)
611a1d56debSopenharmony_ci                    } else {
612a1d56debSopenharmony_ci                        unexpected_character!(self)
613a1d56debSopenharmony_ci                    }
614a1d56debSopenharmony_ci                } else {
615a1d56debSopenharmony_ci                    unexpected_character!(self)
616a1d56debSopenharmony_ci                }
617a1d56debSopenharmony_ci            }
618a1d56debSopenharmony_ci        }
619a1d56debSopenharmony_ci    }
620a1d56debSopenharmony_ci
621a1d56debSopenharmony_ci    fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
622a1d56debSopenharmony_ci    where
623a1d56debSopenharmony_ci        V: Visitor<'de>,
624a1d56debSopenharmony_ci    {
625a1d56debSopenharmony_ci        self.deserialize_str(visitor)
626a1d56debSopenharmony_ci    }
627a1d56debSopenharmony_ci
628a1d56debSopenharmony_ci    fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
629a1d56debSopenharmony_ci    where
630a1d56debSopenharmony_ci        V: Visitor<'de>,
631a1d56debSopenharmony_ci    {
632a1d56debSopenharmony_ci        self.deserialize_any(visitor)
633a1d56debSopenharmony_ci    }
634a1d56debSopenharmony_ci}
635a1d56debSopenharmony_ci
636a1d56debSopenharmony_cistruct SeqAssistant<'a, R: 'a>
637a1d56debSopenharmony_ciwhere
638a1d56debSopenharmony_ci    R: BytesReader + Cacheable,
639a1d56debSopenharmony_ci{
640a1d56debSopenharmony_ci    deserializer: &'a mut Deserializer<R>,
641a1d56debSopenharmony_ci    is_first: bool,
642a1d56debSopenharmony_ci}
643a1d56debSopenharmony_ci
644a1d56debSopenharmony_ciimpl<'a, R: 'a> SeqAssistant<'a, R>
645a1d56debSopenharmony_ciwhere
646a1d56debSopenharmony_ci    R: BytesReader + Cacheable,
647a1d56debSopenharmony_ci{
648a1d56debSopenharmony_ci    fn new(deserializer: &'a mut Deserializer<R>) -> Self {
649a1d56debSopenharmony_ci        SeqAssistant {
650a1d56debSopenharmony_ci            deserializer,
651a1d56debSopenharmony_ci            is_first: true,
652a1d56debSopenharmony_ci        }
653a1d56debSopenharmony_ci    }
654a1d56debSopenharmony_ci}
655a1d56debSopenharmony_ci
656a1d56debSopenharmony_ciimpl<'de, 'a, R> SeqAccess<'de> for SeqAssistant<'a, R>
657a1d56debSopenharmony_ciwhere
658a1d56debSopenharmony_ci    R: BytesReader + Cacheable,
659a1d56debSopenharmony_ci{
660a1d56debSopenharmony_ci    type Error = Error;
661a1d56debSopenharmony_ci
662a1d56debSopenharmony_ci    fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
663a1d56debSopenharmony_ci    where
664a1d56debSopenharmony_ci        T: DeserializeSeed<'de>,
665a1d56debSopenharmony_ci    {
666a1d56debSopenharmony_ci        let peek_ch = match eat_whitespace_until_not!(self.deserializer) {
667a1d56debSopenharmony_ci            Some(b']') => return Ok(None),
668a1d56debSopenharmony_ci            Some(b',') if !self.is_first => {
669a1d56debSopenharmony_ci                self.deserializer.discard_char();
670a1d56debSopenharmony_ci                eat_whitespace_until_not!(self.deserializer)
671a1d56debSopenharmony_ci            }
672a1d56debSopenharmony_ci            Some(ch) => {
673a1d56debSopenharmony_ci                if self.is_first {
674a1d56debSopenharmony_ci                    self.is_first = false;
675a1d56debSopenharmony_ci                    Some(ch)
676a1d56debSopenharmony_ci                } else {
677a1d56debSopenharmony_ci                    let position = self.deserializer.reader.position();
678a1d56debSopenharmony_ci                    return Err(Error::Parsing(MissingComma(
679a1d56debSopenharmony_ci                        position.line(),
680a1d56debSopenharmony_ci                        position.column(),
681a1d56debSopenharmony_ci                    )));
682a1d56debSopenharmony_ci                }
683a1d56debSopenharmony_ci            }
684a1d56debSopenharmony_ci            None => return Err(Error::Parsing(ParsingUnfinished)),
685a1d56debSopenharmony_ci        };
686a1d56debSopenharmony_ci
687a1d56debSopenharmony_ci        match peek_ch {
688a1d56debSopenharmony_ci            Some(b']') => {
689a1d56debSopenharmony_ci                let position = self.deserializer.reader.position();
690a1d56debSopenharmony_ci                Err(Error::Parsing(TrailingComma(
691a1d56debSopenharmony_ci                    position.line(),
692a1d56debSopenharmony_ci                    position.column(),
693a1d56debSopenharmony_ci                )))
694a1d56debSopenharmony_ci            }
695a1d56debSopenharmony_ci            Some(_) => Ok(Some(seed.deserialize(&mut *self.deserializer)?)),
696a1d56debSopenharmony_ci            None => Err(Error::Parsing(ParsingUnfinished)),
697a1d56debSopenharmony_ci        }
698a1d56debSopenharmony_ci    }
699a1d56debSopenharmony_ci}
700a1d56debSopenharmony_ci
701a1d56debSopenharmony_ciimpl<'de, 'a, R> MapAccess<'de> for SeqAssistant<'a, R>
702a1d56debSopenharmony_ciwhere
703a1d56debSopenharmony_ci    R: BytesReader + Cacheable,
704a1d56debSopenharmony_ci{
705a1d56debSopenharmony_ci    type Error = Error;
706a1d56debSopenharmony_ci
707a1d56debSopenharmony_ci    fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
708a1d56debSopenharmony_ci    where
709a1d56debSopenharmony_ci        K: DeserializeSeed<'de>,
710a1d56debSopenharmony_ci    {
711a1d56debSopenharmony_ci        let peek_ch = match eat_whitespace_until_not!(self.deserializer) {
712a1d56debSopenharmony_ci            Some(b'}') => return Ok(None),
713a1d56debSopenharmony_ci            Some(b',') if !self.is_first => {
714a1d56debSopenharmony_ci                self.deserializer.discard_char();
715a1d56debSopenharmony_ci                eat_whitespace_until_not!(self.deserializer)
716a1d56debSopenharmony_ci            }
717a1d56debSopenharmony_ci            Some(ch) => {
718a1d56debSopenharmony_ci                if self.is_first {
719a1d56debSopenharmony_ci                    self.is_first = false;
720a1d56debSopenharmony_ci                    Some(ch)
721a1d56debSopenharmony_ci                } else {
722a1d56debSopenharmony_ci                    let position = self.deserializer.reader.position();
723a1d56debSopenharmony_ci                    return Err(Error::Parsing(MissingComma(
724a1d56debSopenharmony_ci                        position.line(),
725a1d56debSopenharmony_ci                        position.column(),
726a1d56debSopenharmony_ci                    )));
727a1d56debSopenharmony_ci                }
728a1d56debSopenharmony_ci            }
729a1d56debSopenharmony_ci            None => {
730a1d56debSopenharmony_ci                return Err(Error::Parsing(ParsingUnfinished));
731a1d56debSopenharmony_ci            }
732a1d56debSopenharmony_ci        };
733a1d56debSopenharmony_ci
734a1d56debSopenharmony_ci        match peek_ch {
735a1d56debSopenharmony_ci            Some(b'"') => Ok(Some(seed.deserialize(&mut *self.deserializer)?)),
736a1d56debSopenharmony_ci            Some(b'}') => {
737a1d56debSopenharmony_ci                let position = self.deserializer.reader.position();
738a1d56debSopenharmony_ci                Err(Error::Parsing(TrailingComma(
739a1d56debSopenharmony_ci                    position.line(),
740a1d56debSopenharmony_ci                    position.column(),
741a1d56debSopenharmony_ci                )))
742a1d56debSopenharmony_ci            }
743a1d56debSopenharmony_ci            // Object key must be String.
744a1d56debSopenharmony_ci            _ => unexpected_character!(self.deserializer),
745a1d56debSopenharmony_ci        }
746a1d56debSopenharmony_ci    }
747a1d56debSopenharmony_ci
748a1d56debSopenharmony_ci    fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error>
749a1d56debSopenharmony_ci    where
750a1d56debSopenharmony_ci        V: DeserializeSeed<'de>,
751a1d56debSopenharmony_ci    {
752a1d56debSopenharmony_ci        match eat_whitespace_until_not!(self.deserializer) {
753a1d56debSopenharmony_ci            Some(b':') => {
754a1d56debSopenharmony_ci                self.deserializer.discard_char();
755a1d56debSopenharmony_ci                eat_whitespace_until_not!(self.deserializer);
756a1d56debSopenharmony_ci                seed.deserialize(&mut *self.deserializer)
757a1d56debSopenharmony_ci            }
758a1d56debSopenharmony_ci            Some(_ch) => {
759a1d56debSopenharmony_ci                let position = self.deserializer.reader.position();
760a1d56debSopenharmony_ci                Err(Error::Parsing(MissingColon(
761a1d56debSopenharmony_ci                    position.line(),
762a1d56debSopenharmony_ci                    position.column(),
763a1d56debSopenharmony_ci                )))
764a1d56debSopenharmony_ci            }
765a1d56debSopenharmony_ci            None => Err(Error::Parsing(ParsingUnfinished)),
766a1d56debSopenharmony_ci        }
767a1d56debSopenharmony_ci    }
768a1d56debSopenharmony_ci}
769a1d56debSopenharmony_ci
770a1d56debSopenharmony_cistruct EnumAssistant<'a, R: 'a>
771a1d56debSopenharmony_ciwhere
772a1d56debSopenharmony_ci    R: BytesReader + Cacheable,
773a1d56debSopenharmony_ci{
774a1d56debSopenharmony_ci    deserializer: &'a mut Deserializer<R>,
775a1d56debSopenharmony_ci}
776a1d56debSopenharmony_ci
777a1d56debSopenharmony_ciimpl<'a, R: 'a> EnumAssistant<'a, R>
778a1d56debSopenharmony_ciwhere
779a1d56debSopenharmony_ci    R: BytesReader + Cacheable,
780a1d56debSopenharmony_ci{
781a1d56debSopenharmony_ci    fn new(deserializer: &'a mut Deserializer<R>) -> Self {
782a1d56debSopenharmony_ci        EnumAssistant { deserializer }
783a1d56debSopenharmony_ci    }
784a1d56debSopenharmony_ci}
785a1d56debSopenharmony_ci
786a1d56debSopenharmony_ciimpl<'de, 'a, R: 'a> EnumAccess<'de> for EnumAssistant<'a, R>
787a1d56debSopenharmony_ciwhere
788a1d56debSopenharmony_ci    R: BytesReader + Cacheable,
789a1d56debSopenharmony_ci{
790a1d56debSopenharmony_ci    type Error = Error;
791a1d56debSopenharmony_ci    type Variant = Self;
792a1d56debSopenharmony_ci
793a1d56debSopenharmony_ci    fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
794a1d56debSopenharmony_ci    where
795a1d56debSopenharmony_ci        V: DeserializeSeed<'de>,
796a1d56debSopenharmony_ci    {
797a1d56debSopenharmony_ci        let value = seed.deserialize(&mut *self.deserializer)?;
798a1d56debSopenharmony_ci
799a1d56debSopenharmony_ci        match eat_whitespace_until_not!(self.deserializer) {
800a1d56debSopenharmony_ci            Some(b':') => {
801a1d56debSopenharmony_ci                self.deserializer.discard_char();
802a1d56debSopenharmony_ci                Ok((value, self))
803a1d56debSopenharmony_ci            }
804a1d56debSopenharmony_ci            _ => unexpected_character!(self.deserializer),
805a1d56debSopenharmony_ci        }
806a1d56debSopenharmony_ci    }
807a1d56debSopenharmony_ci}
808a1d56debSopenharmony_ci
809a1d56debSopenharmony_ciimpl<'de, 'a, R: 'a> VariantAccess<'de> for EnumAssistant<'a, R>
810a1d56debSopenharmony_ciwhere
811a1d56debSopenharmony_ci    R: BytesReader + Cacheable,
812a1d56debSopenharmony_ci{
813a1d56debSopenharmony_ci    type Error = Error;
814a1d56debSopenharmony_ci
815a1d56debSopenharmony_ci    fn unit_variant(self) -> Result<(), Error> {
816a1d56debSopenharmony_ci        serde::de::Deserialize::deserialize(self.deserializer)
817a1d56debSopenharmony_ci    }
818a1d56debSopenharmony_ci
819a1d56debSopenharmony_ci    fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
820a1d56debSopenharmony_ci    where
821a1d56debSopenharmony_ci        T: DeserializeSeed<'de>,
822a1d56debSopenharmony_ci    {
823a1d56debSopenharmony_ci        seed.deserialize(self.deserializer)
824a1d56debSopenharmony_ci    }
825a1d56debSopenharmony_ci
826a1d56debSopenharmony_ci    fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
827a1d56debSopenharmony_ci    where
828a1d56debSopenharmony_ci        V: Visitor<'de>,
829a1d56debSopenharmony_ci    {
830a1d56debSopenharmony_ci        serde::de::Deserializer::deserialize_seq(self.deserializer, visitor)
831a1d56debSopenharmony_ci    }
832a1d56debSopenharmony_ci
833a1d56debSopenharmony_ci    fn struct_variant<V>(
834a1d56debSopenharmony_ci        self,
835a1d56debSopenharmony_ci        _fields: &'static [&'static str],
836a1d56debSopenharmony_ci        visitor: V,
837a1d56debSopenharmony_ci    ) -> Result<V::Value, Self::Error>
838a1d56debSopenharmony_ci    where
839a1d56debSopenharmony_ci        V: Visitor<'de>,
840a1d56debSopenharmony_ci    {
841a1d56debSopenharmony_ci        serde::de::Deserializer::deserialize_map(self.deserializer, visitor)
842a1d56debSopenharmony_ci    }
843a1d56debSopenharmony_ci}
844a1d56debSopenharmony_ci
845a1d56debSopenharmony_ci#[cfg(test)]
846a1d56debSopenharmony_cimod ut_test_for_deserializer {
847a1d56debSopenharmony_ci    use crate::deserializer::{from_slice, from_str};
848a1d56debSopenharmony_ci    use serde::Deserialize;
849a1d56debSopenharmony_ci    use std::borrow::Cow;
850a1d56debSopenharmony_ci    use std::collections::HashMap;
851a1d56debSopenharmony_ci    use std::option::Option;
852a1d56debSopenharmony_ci
853a1d56debSopenharmony_ci    /// UT test to deserialize simple types
854a1d56debSopenharmony_ci    ///
855a1d56debSopenharmony_ci    /// # Title
856a1d56debSopenharmony_ci    /// ut_deserialize_simple
857a1d56debSopenharmony_ci    ///
858a1d56debSopenharmony_ci    /// # Brief
859a1d56debSopenharmony_ci    /// 1.Uses deserializer::from_slice method to deserialize simple types.
860a1d56debSopenharmony_ci    /// 2.Checks if the test results are correct.
861a1d56debSopenharmony_ci    #[test]
862a1d56debSopenharmony_ci    fn ut_deserialize_simple() {
863a1d56debSopenharmony_ci        let slice_null = b"null";
864a1d56debSopenharmony_ci        let expected: Option<i32> = None;
865a1d56debSopenharmony_ci        assert_eq!(expected, from_slice(slice_null).unwrap());
866a1d56debSopenharmony_ci
867a1d56debSopenharmony_ci        let slice_bool = b"true";
868a1d56debSopenharmony_ci        let expected = true;
869a1d56debSopenharmony_ci        assert_eq!(expected, from_slice(slice_bool).unwrap());
870a1d56debSopenharmony_ci
871a1d56debSopenharmony_ci        let slice_bool = b"false";
872a1d56debSopenharmony_ci        let expected = false;
873a1d56debSopenharmony_ci        assert_eq!(expected, from_slice(slice_bool).unwrap());
874a1d56debSopenharmony_ci
875a1d56debSopenharmony_ci        let slice_num = b"123";
876a1d56debSopenharmony_ci        let expected: u8 = 123;
877a1d56debSopenharmony_ci        assert_eq!(expected, from_slice(slice_num).unwrap());
878a1d56debSopenharmony_ci
879a1d56debSopenharmony_ci        let slice_num = b"123";
880a1d56debSopenharmony_ci        let expected: u16 = 123;
881a1d56debSopenharmony_ci        assert_eq!(expected, from_slice(slice_num).unwrap());
882a1d56debSopenharmony_ci
883a1d56debSopenharmony_ci        let slice_num = b"123";
884a1d56debSopenharmony_ci        let expected: u32 = 123;
885a1d56debSopenharmony_ci        assert_eq!(expected, from_slice(slice_num).unwrap());
886a1d56debSopenharmony_ci
887a1d56debSopenharmony_ci        let slice_num = b"-12";
888a1d56debSopenharmony_ci        let expected: i8 = -12;
889a1d56debSopenharmony_ci        assert_eq!(expected, from_slice(slice_num).unwrap());
890a1d56debSopenharmony_ci
891a1d56debSopenharmony_ci        let slice_num = b"-12";
892a1d56debSopenharmony_ci        let expected: i16 = -12;
893a1d56debSopenharmony_ci        assert_eq!(expected, from_slice(slice_num).unwrap());
894a1d56debSopenharmony_ci
895a1d56debSopenharmony_ci        let slice_num = b"-321";
896a1d56debSopenharmony_ci        let expected: i32 = -321;
897a1d56debSopenharmony_ci        assert_eq!(expected, from_slice(slice_num).unwrap());
898a1d56debSopenharmony_ci
899a1d56debSopenharmony_ci        let slice_num = b"-321.123";
900a1d56debSopenharmony_ci        let expected: f32 = -321.123;
901a1d56debSopenharmony_ci        assert_eq!(expected, from_slice(slice_num).unwrap());
902a1d56debSopenharmony_ci
903a1d56debSopenharmony_ci        let slice_char = b"\"c\"";
904a1d56debSopenharmony_ci        let expected = 'c';
905a1d56debSopenharmony_ci        assert_eq!(expected, from_slice::<char>(slice_char).unwrap());
906a1d56debSopenharmony_ci
907a1d56debSopenharmony_ci        let slice_str = b"\"string\"";
908a1d56debSopenharmony_ci        let expected = String::from("string");
909a1d56debSopenharmony_ci        assert_eq!(expected, from_slice::<String>(slice_str).unwrap());
910a1d56debSopenharmony_ci
911a1d56debSopenharmony_ci        let slice_option = b"true";
912a1d56debSopenharmony_ci        let expected = Some(true);
913a1d56debSopenharmony_ci        assert_eq!(expected, from_slice::<Option<bool>>(slice_option).unwrap());
914a1d56debSopenharmony_ci
915a1d56debSopenharmony_ci        let slice_option = b"null";
916a1d56debSopenharmony_ci        let expected = None;
917a1d56debSopenharmony_ci        assert_eq!(expected, from_slice::<Option<bool>>(slice_option).unwrap());
918a1d56debSopenharmony_ci
919a1d56debSopenharmony_ci        let slice_seq = b"[1, 2, 3]";
920a1d56debSopenharmony_ci        let expected: Vec<u8> = vec![1, 2, 3];
921a1d56debSopenharmony_ci        assert_eq!(expected, from_slice::<Vec<u8>>(slice_seq).unwrap());
922a1d56debSopenharmony_ci
923a1d56debSopenharmony_ci        let slice_map = r#"{ "apple" : 3 }"#.as_bytes();
924a1d56debSopenharmony_ci        let mut expected = HashMap::new();
925a1d56debSopenharmony_ci        expected.insert("appple", 3);
926a1d56debSopenharmony_ci        assert_eq!(
927a1d56debSopenharmony_ci            expected,
928a1d56debSopenharmony_ci            crate::from_slice::<HashMap<&str, i32>>(slice_map).unwrap()
929a1d56debSopenharmony_ci        );
930a1d56debSopenharmony_ci    }
931a1d56debSopenharmony_ci
932a1d56debSopenharmony_ci    #[test]
933a1d56debSopenharmony_ci    fn de_map() {
934a1d56debSopenharmony_ci        use std::collections::HashMap;
935a1d56debSopenharmony_ci        let slice_map = r#"{ "apple" : 3 }"#.as_bytes();
936a1d56debSopenharmony_ci        let mut expected = HashMap::new();
937a1d56debSopenharmony_ci        expected.insert(String::from("apple"), 3);
938a1d56debSopenharmony_ci        assert_eq!(
939a1d56debSopenharmony_ci            expected,
940a1d56debSopenharmony_ci            from_slice::<HashMap<String, i32>>(slice_map).unwrap()
941a1d56debSopenharmony_ci        );
942a1d56debSopenharmony_ci    }
943a1d56debSopenharmony_ci
944a1d56debSopenharmony_ci    /// UT test to deserialize simple types with abnormal input of JSON.
945a1d56debSopenharmony_ci    ///
946a1d56debSopenharmony_ci    /// # Title
947a1d56debSopenharmony_ci    /// ut_deserialize_simple_error
948a1d56debSopenharmony_ci    ///
949a1d56debSopenharmony_ci    /// # Brief
950a1d56debSopenharmony_ci    /// 1.Uses deserializer::from_slice method to deserialize simple types with abnormal input of JSON.
951a1d56debSopenharmony_ci    /// 2.Checks if the test results are correct.
952a1d56debSopenharmony_ci    #[test]
953a1d56debSopenharmony_ci    fn ut_deserialize_simple_error() {
954a1d56debSopenharmony_ci        // The following is the test for abnormal input of JSON.
955a1d56debSopenharmony_ci        let incorrect_input = b"nul";
956a1d56debSopenharmony_ci        let res = from_slice::<i32>(incorrect_input);
957a1d56debSopenharmony_ci        assert!(res.is_err());
958a1d56debSopenharmony_ci
959a1d56debSopenharmony_ci        let incorrect_input = b"  ";
960a1d56debSopenharmony_ci        let res = from_slice::<bool>(incorrect_input);
961a1d56debSopenharmony_ci        assert!(res.is_err());
962a1d56debSopenharmony_ci
963a1d56debSopenharmony_ci        let incorrect_input = b"tru";
964a1d56debSopenharmony_ci        let res = from_slice::<bool>(incorrect_input);
965a1d56debSopenharmony_ci        assert!(res.is_err());
966a1d56debSopenharmony_ci
967a1d56debSopenharmony_ci        let incorrect_input = b"fals";
968a1d56debSopenharmony_ci        let res = from_slice::<bool>(incorrect_input);
969a1d56debSopenharmony_ci        assert!(res.is_err());
970a1d56debSopenharmony_ci
971a1d56debSopenharmony_ci        let incorrect_input = b"ruet";
972a1d56debSopenharmony_ci        let res = from_slice::<bool>(incorrect_input);
973a1d56debSopenharmony_ci        assert!(res.is_err());
974a1d56debSopenharmony_ci
975a1d56debSopenharmony_ci        let incorrect_input = b"  ";
976a1d56debSopenharmony_ci        let res = from_slice::<u64>(incorrect_input);
977a1d56debSopenharmony_ci        assert!(res.is_err());
978a1d56debSopenharmony_ci
979a1d56debSopenharmony_ci        let incorrect_input = b"12x";
980a1d56debSopenharmony_ci        let res = from_slice::<u64>(incorrect_input);
981a1d56debSopenharmony_ci        assert!(res.is_err());
982a1d56debSopenharmony_ci
983a1d56debSopenharmony_ci        let incorrect_input = b"-12x";
984a1d56debSopenharmony_ci        let res = from_slice::<i64>(incorrect_input);
985a1d56debSopenharmony_ci        assert!(res.is_err());
986a1d56debSopenharmony_ci
987a1d56debSopenharmony_ci        let incorrect_input = b"-12.21x";
988a1d56debSopenharmony_ci        let res = from_slice::<f64>(incorrect_input);
989a1d56debSopenharmony_ci        assert!(res.is_err());
990a1d56debSopenharmony_ci
991a1d56debSopenharmony_ci        let incorrect_input = b"  ";
992a1d56debSopenharmony_ci        let res = from_slice::<String>(incorrect_input);
993a1d56debSopenharmony_ci        assert!(res.is_err());
994a1d56debSopenharmony_ci
995a1d56debSopenharmony_ci        let incorrect_input = b"string";
996a1d56debSopenharmony_ci        let res = from_slice::<String>(incorrect_input);
997a1d56debSopenharmony_ci        assert!(res.is_err());
998a1d56debSopenharmony_ci
999a1d56debSopenharmony_ci        let incorrect_input = b"\"string";
1000a1d56debSopenharmony_ci        let res = from_slice::<String>(incorrect_input);
1001a1d56debSopenharmony_ci        assert!(res.is_err());
1002a1d56debSopenharmony_ci
1003a1d56debSopenharmony_ci        let incorrect_input = b"  ";
1004a1d56debSopenharmony_ci        let res = from_slice::<Option<bool>>(incorrect_input);
1005a1d56debSopenharmony_ci        assert!(res.is_err());
1006a1d56debSopenharmony_ci
1007a1d56debSopenharmony_ci        let incorrect_input = b"  ";
1008a1d56debSopenharmony_ci        let res = from_slice::<Vec<u8>>(incorrect_input);
1009a1d56debSopenharmony_ci        assert!(res.is_err());
1010a1d56debSopenharmony_ci
1011a1d56debSopenharmony_ci        let incorrect_input = b"  [";
1012a1d56debSopenharmony_ci        let res = from_slice::<Vec<u8>>(incorrect_input);
1013a1d56debSopenharmony_ci        assert!(res.is_err());
1014a1d56debSopenharmony_ci
1015a1d56debSopenharmony_ci        let incorrect_input = b"  [ 1";
1016a1d56debSopenharmony_ci        let res = from_slice::<Vec<u8>>(incorrect_input);
1017a1d56debSopenharmony_ci        assert!(res.is_err());
1018a1d56debSopenharmony_ci
1019a1d56debSopenharmony_ci        let incorrect_input = r#"  "#.as_bytes();
1020a1d56debSopenharmony_ci        let res = from_slice::<HashMap<bool, i32>>(incorrect_input);
1021a1d56debSopenharmony_ci        assert!(res.is_err());
1022a1d56debSopenharmony_ci
1023a1d56debSopenharmony_ci        let incorrect_input = r#"{ true x: 1 }"#.as_bytes();
1024a1d56debSopenharmony_ci        let res = from_slice::<HashMap<bool, i32>>(incorrect_input);
1025a1d56debSopenharmony_ci        assert!(res.is_err());
1026a1d56debSopenharmony_ci
1027a1d56debSopenharmony_ci        let incorrect_input = r#"{ : 1 }"#.as_bytes();
1028a1d56debSopenharmony_ci        let res = from_slice::<HashMap<bool, i32>>(incorrect_input);
1029a1d56debSopenharmony_ci        assert!(res.is_err());
1030a1d56debSopenharmony_ci    }
1031a1d56debSopenharmony_ci
1032a1d56debSopenharmony_ci    /// UT test to deserialize struct
1033a1d56debSopenharmony_ci    ///
1034a1d56debSopenharmony_ci    /// # Title
1035a1d56debSopenharmony_ci    /// ut_deserialize_struct
1036a1d56debSopenharmony_ci    ///
1037a1d56debSopenharmony_ci    /// # Brief
1038a1d56debSopenharmony_ci    /// 1.Uses deserializer::from_str method to deserialize struct.
1039a1d56debSopenharmony_ci    /// 2.Checks if the test results are correct.
1040a1d56debSopenharmony_ci    #[test]
1041a1d56debSopenharmony_ci    fn ut_deserialize_struct() {
1042a1d56debSopenharmony_ci        #[derive(Deserialize, PartialEq, Debug)]
1043a1d56debSopenharmony_ci        struct TestUnit;
1044a1d56debSopenharmony_ci        let str = "null";
1045a1d56debSopenharmony_ci        let expected = TestUnit;
1046a1d56debSopenharmony_ci        assert_eq!(expected, from_str(str).unwrap());
1047a1d56debSopenharmony_ci
1048a1d56debSopenharmony_ci        #[derive(Deserialize, PartialEq, Debug)]
1049a1d56debSopenharmony_ci        struct TestNewtype(u32);
1050a1d56debSopenharmony_ci        let str = "123";
1051a1d56debSopenharmony_ci        let expected = TestNewtype(123);
1052a1d56debSopenharmony_ci        assert_eq!(expected, from_str(str).unwrap());
1053a1d56debSopenharmony_ci
1054a1d56debSopenharmony_ci        #[derive(Deserialize, PartialEq, Debug)]
1055a1d56debSopenharmony_ci        struct TestTuple(u32, u32, bool);
1056a1d56debSopenharmony_ci        let str = "[123,321,true]";
1057a1d56debSopenharmony_ci        let expected = TestTuple(123, 321, true);
1058a1d56debSopenharmony_ci        assert_eq!(expected, from_str(str).unwrap());
1059a1d56debSopenharmony_ci
1060a1d56debSopenharmony_ci        #[derive(Deserialize, PartialEq, Debug)]
1061a1d56debSopenharmony_ci        struct Test {
1062a1d56debSopenharmony_ci            int: u32,
1063a1d56debSopenharmony_ci            seq: Vec<String>,
1064a1d56debSopenharmony_ci            tup: (i32, i32, i32),
1065a1d56debSopenharmony_ci        }
1066a1d56debSopenharmony_ci
1067a1d56debSopenharmony_ci        let str = r#"{"int":1,"seq":["abcd","efgh"],"tup":[1,2,3]}"#;
1068a1d56debSopenharmony_ci        let expected = Test {
1069a1d56debSopenharmony_ci            int: 1,
1070a1d56debSopenharmony_ci            seq: vec![String::from("abcd"), String::from("efgh")],
1071a1d56debSopenharmony_ci            tup: (1, 2, 3),
1072a1d56debSopenharmony_ci        };
1073a1d56debSopenharmony_ci        assert_eq!(expected, from_str(str).unwrap());
1074a1d56debSopenharmony_ci
1075a1d56debSopenharmony_ci        let str = r#"{
1076a1d56debSopenharmony_ci            "int" : 1 ,
1077a1d56debSopenharmony_ci            "seq" : ["abcd" , "efgh" ],
1078a1d56debSopenharmony_ci            "tup" : [1, 2 ,3 ]
1079a1d56debSopenharmony_ci        }"#;
1080a1d56debSopenharmony_ci        let expected = Test {
1081a1d56debSopenharmony_ci            int: 1,
1082a1d56debSopenharmony_ci            seq: vec![String::from("abcd"), String::from("efgh")],
1083a1d56debSopenharmony_ci            tup: (1, 2, 3),
1084a1d56debSopenharmony_ci        };
1085a1d56debSopenharmony_ci        assert_eq!(expected, from_str(str).unwrap());
1086a1d56debSopenharmony_ci
1087a1d56debSopenharmony_ci        // The following is the test for abnormal input of JSON.
1088a1d56debSopenharmony_ci        // Missing '}' at the end.
1089a1d56debSopenharmony_ci        let str_abnormal = r#"{"int":1,"seq":["abcd","efgh"],"tup":[1,2,3]"#;
1090a1d56debSopenharmony_ci        let res = from_str::<Test>(str_abnormal);
1091a1d56debSopenharmony_ci        assert!(res.is_err());
1092a1d56debSopenharmony_ci
1093a1d56debSopenharmony_ci        // Missing ','.
1094a1d56debSopenharmony_ci        let str_abnormal = r#"{"int":1 "seq":["abcd","efgh"],"tup":[1,2,3]"#;
1095a1d56debSopenharmony_ci        let res = from_str::<Test>(str_abnormal);
1096a1d56debSopenharmony_ci        assert!(res.is_err());
1097a1d56debSopenharmony_ci
1098a1d56debSopenharmony_ci        // Trailing ','.
1099a1d56debSopenharmony_ci        let str_abnormal = r#"{"int":1, "seq":["abcd","efgh",],"tup":[1,2,3]"#;
1100a1d56debSopenharmony_ci        let res = from_str::<Test>(str_abnormal);
1101a1d56debSopenharmony_ci        assert!(res.is_err());
1102a1d56debSopenharmony_ci
1103a1d56debSopenharmony_ci        // Missing ':'.
1104a1d56debSopenharmony_ci        let str_abnormal = r#"{"int":1, "seq":["abcd","efgh"],"tup" [1,2,3]"#;
1105a1d56debSopenharmony_ci        let res = from_str::<Test>(str_abnormal);
1106a1d56debSopenharmony_ci        assert!(res.is_err());
1107a1d56debSopenharmony_ci
1108a1d56debSopenharmony_ci        // Incorrect field name.
1109a1d56debSopenharmony_ci        let str_abnormal = r#"{"it":1, "sq" : ["abcd","efgh"],"tp": [1,2,3]"#;
1110a1d56debSopenharmony_ci        let res = from_str::<Test>(str_abnormal);
1111a1d56debSopenharmony_ci        assert!(res.is_err());
1112a1d56debSopenharmony_ci    }
1113a1d56debSopenharmony_ci
1114a1d56debSopenharmony_ci    /// UT test to deserialize enum
1115a1d56debSopenharmony_ci    ///
1116a1d56debSopenharmony_ci    /// # Title
1117a1d56debSopenharmony_ci    /// ut_deserialize_enum
1118a1d56debSopenharmony_ci    ///
1119a1d56debSopenharmony_ci    /// # Brief
1120a1d56debSopenharmony_ci    /// 1.Uses deserializer::from_slice method to deserialize enum.
1121a1d56debSopenharmony_ci    /// 2.Checks if the test results are correct.
1122a1d56debSopenharmony_ci    #[test]
1123a1d56debSopenharmony_ci    fn ut_deserialize_enum() {
1124a1d56debSopenharmony_ci        #[derive(Deserialize, PartialEq, Debug)]
1125a1d56debSopenharmony_ci        enum E<'a> {
1126a1d56debSopenharmony_ci            Unit,
1127a1d56debSopenharmony_ci            Newtype(u32),
1128a1d56debSopenharmony_ci            Tuple(u32, u32),
1129a1d56debSopenharmony_ci            Struct { a: u32 },
1130a1d56debSopenharmony_ci            Reference(Cow<'a, str>),
1131a1d56debSopenharmony_ci        }
1132a1d56debSopenharmony_ci
1133a1d56debSopenharmony_ci        let u = r#""Unit""#.as_bytes();
1134a1d56debSopenharmony_ci        let expected = E::Unit;
1135a1d56debSopenharmony_ci        assert_eq!(expected, from_slice(u).unwrap());
1136a1d56debSopenharmony_ci
1137a1d56debSopenharmony_ci        let n = r#"{"Newtype":1}"#.as_bytes();
1138a1d56debSopenharmony_ci        let expected = E::Newtype(1);
1139a1d56debSopenharmony_ci        assert_eq!(expected, from_slice(n).unwrap());
1140a1d56debSopenharmony_ci
1141a1d56debSopenharmony_ci        let t = r#"{"Tuple":[1,2]}"#.as_bytes();
1142a1d56debSopenharmony_ci        let expected = E::Tuple(1, 2);
1143a1d56debSopenharmony_ci        assert_eq!(expected, from_slice(t).unwrap());
1144a1d56debSopenharmony_ci
1145a1d56debSopenharmony_ci        let s = r#"{"Struct":{"a":1}}"#.as_bytes();
1146a1d56debSopenharmony_ci        let expected = E::Struct { a: 1 };
1147a1d56debSopenharmony_ci        assert_eq!(expected, from_slice(s).unwrap());
1148a1d56debSopenharmony_ci
1149a1d56debSopenharmony_ci        let s = r#"{"Reference":"reference"}"#.as_bytes();
1150a1d56debSopenharmony_ci        let expected = E::Reference(Cow::from("reference"));
1151a1d56debSopenharmony_ci        assert_eq!(expected, from_slice(s).unwrap());
1152a1d56debSopenharmony_ci
1153a1d56debSopenharmony_ci        // The following is the test for abnormal input of JSON.
1154a1d56debSopenharmony_ci        let slice_abnormal = r#"   "#.as_bytes();
1155a1d56debSopenharmony_ci        let res = from_slice::<E>(slice_abnormal);
1156a1d56debSopenharmony_ci        assert!(res.is_err());
1157a1d56debSopenharmony_ci
1158a1d56debSopenharmony_ci        let slice_abnormal = r#"x"#.as_bytes();
1159a1d56debSopenharmony_ci        let res = from_slice::<E>(slice_abnormal);
1160a1d56debSopenharmony_ci        assert!(res.is_err());
1161a1d56debSopenharmony_ci
1162a1d56debSopenharmony_ci        let slice_abnormal = r#""Unit"#.as_bytes();
1163a1d56debSopenharmony_ci        let res = from_slice::<E>(slice_abnormal);
1164a1d56debSopenharmony_ci        assert!(res.is_err());
1165a1d56debSopenharmony_ci
1166a1d56debSopenharmony_ci        let slice_abnormal = r#"{"Newtype" 1"#.as_bytes();
1167a1d56debSopenharmony_ci        let res = from_slice::<E>(slice_abnormal);
1168a1d56debSopenharmony_ci        assert!(res.is_err());
1169a1d56debSopenharmony_ci
1170a1d56debSopenharmony_ci        let slice_abnormal = r#"{"Newtype":1"#.as_bytes();
1171a1d56debSopenharmony_ci        let res = from_slice::<E>(slice_abnormal);
1172a1d56debSopenharmony_ci        assert!(res.is_err());
1173a1d56debSopenharmony_ci
1174a1d56debSopenharmony_ci        let slice_abnormal = r#"{"Tuple":[1,2}"#.as_bytes();
1175a1d56debSopenharmony_ci        let res = from_slice::<E>(slice_abnormal);
1176a1d56debSopenharmony_ci        assert!(res.is_err());
1177a1d56debSopenharmony_ci    }
1178a1d56debSopenharmony_ci}
1179