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