1 use crate::error::Error;
2 use crate::token::Token;
3 use serde::de::value::{MapAccessDeserializer, SeqAccessDeserializer};
4 use serde::de::{
5 self, Deserialize, DeserializeSeed, EnumAccess, IntoDeserializer, MapAccess, SeqAccess,
6 VariantAccess, Visitor,
7 };
8 use serde::forward_to_deserialize_any;
9
10 #[derive(Debug)]
11 pub struct Deserializer<'de> {
12 tokens: &'de [Token],
13 }
14
assert_next_token(de: &mut Deserializer, expected: Token) -> Result<(), Error>15 fn assert_next_token(de: &mut Deserializer, expected: Token) -> Result<(), Error> {
16 match de.next_token_opt() {
17 Some(token) if token == expected => Ok(()),
18 Some(other) => Err(de::Error::custom(format!(
19 "expected Token::{} but deserialization wants Token::{}",
20 other, expected,
21 ))),
22 None => Err(de::Error::custom(format!(
23 "end of tokens but deserialization wants Token::{}",
24 expected,
25 ))),
26 }
27 }
28
unexpected(token: Token) -> Error29 fn unexpected(token: Token) -> Error {
30 de::Error::custom(format!(
31 "deserialization did not expect this token: {}",
32 token,
33 ))
34 }
35
end_of_tokens() -> Error36 fn end_of_tokens() -> Error {
37 de::Error::custom("ran out of tokens to deserialize")
38 }
39
40 impl<'de> Deserializer<'de> {
new(tokens: &'de [Token]) -> Self41 pub fn new(tokens: &'de [Token]) -> Self {
42 Deserializer { tokens }
43 }
44
peek_token_opt(&self) -> Option<Token>45 fn peek_token_opt(&self) -> Option<Token> {
46 self.tokens.first().copied()
47 }
48
peek_token(&self) -> Result<Token, Error>49 fn peek_token(&self) -> Result<Token, Error> {
50 self.peek_token_opt().ok_or_else(end_of_tokens)
51 }
52
next_token_opt(&mut self) -> Option<Token>53 pub fn next_token_opt(&mut self) -> Option<Token> {
54 match self.tokens.split_first() {
55 Some((&first, rest)) => {
56 self.tokens = rest;
57 Some(first)
58 }
59 None => None,
60 }
61 }
62
next_token(&mut self) -> Result<Token, Error>63 fn next_token(&mut self) -> Result<Token, Error> {
64 let (&first, rest) = self.tokens.split_first().ok_or_else(end_of_tokens)?;
65 self.tokens = rest;
66 Ok(first)
67 }
68
remaining(&self) -> usize69 pub fn remaining(&self) -> usize {
70 self.tokens.len()
71 }
72
visit_seq<V>( &mut self, len: Option<usize>, end: Token, visitor: V, ) -> Result<V::Value, Error> where V: Visitor<'de>,73 fn visit_seq<V>(
74 &mut self,
75 len: Option<usize>,
76 end: Token,
77 visitor: V,
78 ) -> Result<V::Value, Error>
79 where
80 V: Visitor<'de>,
81 {
82 let value = visitor.visit_seq(DeserializerSeqVisitor { de: self, len, end })?;
83 assert_next_token(self, end)?;
84 Ok(value)
85 }
86
visit_map<V>( &mut self, len: Option<usize>, end: Token, visitor: V, ) -> Result<V::Value, Error> where V: Visitor<'de>,87 fn visit_map<V>(
88 &mut self,
89 len: Option<usize>,
90 end: Token,
91 visitor: V,
92 ) -> Result<V::Value, Error>
93 where
94 V: Visitor<'de>,
95 {
96 let value = visitor.visit_map(DeserializerMapVisitor { de: self, len, end })?;
97 assert_next_token(self, end)?;
98 Ok(value)
99 }
100 }
101
102 impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
103 type Error = Error;
104
105 forward_to_deserialize_any! {
106 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
107 bytes byte_buf unit seq map identifier ignored_any
108 }
109
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,110 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Error>
111 where
112 V: Visitor<'de>,
113 {
114 let token = self.next_token()?;
115 match token {
116 Token::Bool(v) => visitor.visit_bool(v),
117 Token::I8(v) => visitor.visit_i8(v),
118 Token::I16(v) => visitor.visit_i16(v),
119 Token::I32(v) => visitor.visit_i32(v),
120 Token::I64(v) => visitor.visit_i64(v),
121 Token::U8(v) => visitor.visit_u8(v),
122 Token::U16(v) => visitor.visit_u16(v),
123 Token::U32(v) => visitor.visit_u32(v),
124 Token::U64(v) => visitor.visit_u64(v),
125 Token::F32(v) => visitor.visit_f32(v),
126 Token::F64(v) => visitor.visit_f64(v),
127 Token::Char(v) => visitor.visit_char(v),
128 Token::Str(v) => visitor.visit_str(v),
129 Token::BorrowedStr(v) => visitor.visit_borrowed_str(v),
130 Token::String(v) => visitor.visit_string(v.to_owned()),
131 Token::Bytes(v) => visitor.visit_bytes(v),
132 Token::BorrowedBytes(v) => visitor.visit_borrowed_bytes(v),
133 Token::ByteBuf(v) => visitor.visit_byte_buf(v.to_vec()),
134 Token::None => visitor.visit_none(),
135 Token::Some => visitor.visit_some(self),
136 Token::Unit | Token::UnitStruct { .. } => visitor.visit_unit(),
137 Token::NewtypeStruct { .. } => visitor.visit_newtype_struct(self),
138 Token::Seq { len } => self.visit_seq(len, Token::SeqEnd, visitor),
139 Token::Tuple { len } => self.visit_seq(Some(len), Token::TupleEnd, visitor),
140 Token::TupleStruct { len, .. } => {
141 self.visit_seq(Some(len), Token::TupleStructEnd, visitor)
142 }
143 Token::Map { len } => self.visit_map(len, Token::MapEnd, visitor),
144 Token::Struct { len, .. } => self.visit_map(Some(len), Token::StructEnd, visitor),
145 Token::Enum { .. } => {
146 let variant = self.next_token()?;
147 let next = self.peek_token()?;
148 match (variant, next) {
149 (Token::Str(variant), Token::Unit) => {
150 self.next_token()?;
151 visitor.visit_str(variant)
152 }
153 (Token::BorrowedStr(variant), Token::Unit) => {
154 self.next_token()?;
155 visitor.visit_borrowed_str(variant)
156 }
157 (Token::String(variant), Token::Unit) => {
158 self.next_token()?;
159 visitor.visit_string(variant.to_string())
160 }
161 (Token::Bytes(variant), Token::Unit) => {
162 self.next_token()?;
163 visitor.visit_bytes(variant)
164 }
165 (Token::BorrowedBytes(variant), Token::Unit) => {
166 self.next_token()?;
167 visitor.visit_borrowed_bytes(variant)
168 }
169 (Token::ByteBuf(variant), Token::Unit) => {
170 self.next_token()?;
171 visitor.visit_byte_buf(variant.to_vec())
172 }
173 (Token::U8(variant), Token::Unit) => {
174 self.next_token()?;
175 visitor.visit_u8(variant)
176 }
177 (Token::U16(variant), Token::Unit) => {
178 self.next_token()?;
179 visitor.visit_u16(variant)
180 }
181 (Token::U32(variant), Token::Unit) => {
182 self.next_token()?;
183 visitor.visit_u32(variant)
184 }
185 (Token::U64(variant), Token::Unit) => {
186 self.next_token()?;
187 visitor.visit_u64(variant)
188 }
189 (variant, Token::Unit) => Err(unexpected(variant)),
190 (variant, _) => {
191 visitor.visit_map(EnumMapVisitor::new(self, variant, EnumFormat::Any))
192 }
193 }
194 }
195 Token::UnitVariant { variant, .. } => visitor.visit_str(variant),
196 Token::NewtypeVariant { variant, .. } => visitor.visit_map(EnumMapVisitor::new(
197 self,
198 Token::Str(variant),
199 EnumFormat::Any,
200 )),
201 Token::TupleVariant { variant, .. } => visitor.visit_map(EnumMapVisitor::new(
202 self,
203 Token::Str(variant),
204 EnumFormat::Seq,
205 )),
206 Token::StructVariant { variant, .. } => visitor.visit_map(EnumMapVisitor::new(
207 self,
208 Token::Str(variant),
209 EnumFormat::Map,
210 )),
211 Token::SeqEnd
212 | Token::TupleEnd
213 | Token::TupleStructEnd
214 | Token::MapEnd
215 | Token::StructEnd
216 | Token::TupleVariantEnd
217 | Token::StructVariantEnd => Err(unexpected(token)),
218 }
219 }
220
deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,221 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Error>
222 where
223 V: Visitor<'de>,
224 {
225 match self.peek_token()? {
226 Token::Unit | Token::None => {
227 self.next_token()?;
228 visitor.visit_none()
229 }
230 Token::Some => {
231 self.next_token()?;
232 visitor.visit_some(self)
233 }
234 _ => self.deserialize_any(visitor),
235 }
236 }
237
deserialize_enum<V>( self, name: &'static str, _variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, Error> where V: Visitor<'de>,238 fn deserialize_enum<V>(
239 self,
240 name: &'static str,
241 _variants: &'static [&'static str],
242 visitor: V,
243 ) -> Result<V::Value, Error>
244 where
245 V: Visitor<'de>,
246 {
247 match self.peek_token()? {
248 Token::Enum { name: n } if name == n => {
249 self.next_token()?;
250
251 visitor.visit_enum(DeserializerEnumVisitor { de: self })
252 }
253 Token::UnitVariant { name: n, .. }
254 | Token::NewtypeVariant { name: n, .. }
255 | Token::TupleVariant { name: n, .. }
256 | Token::StructVariant { name: n, .. }
257 if name == n =>
258 {
259 visitor.visit_enum(DeserializerEnumVisitor { de: self })
260 }
261 _ => self.deserialize_any(visitor),
262 }
263 }
264
deserialize_unit_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,265 fn deserialize_unit_struct<V>(self, name: &'static str, visitor: V) -> Result<V::Value, Error>
266 where
267 V: Visitor<'de>,
268 {
269 match self.peek_token()? {
270 Token::UnitStruct { .. } => {
271 assert_next_token(self, Token::UnitStruct { name })?;
272 visitor.visit_unit()
273 }
274 _ => self.deserialize_any(visitor),
275 }
276 }
277
deserialize_newtype_struct<V>( self, name: &'static str, visitor: V, ) -> Result<V::Value, Error> where V: Visitor<'de>,278 fn deserialize_newtype_struct<V>(
279 self,
280 name: &'static str,
281 visitor: V,
282 ) -> Result<V::Value, Error>
283 where
284 V: Visitor<'de>,
285 {
286 match self.peek_token()? {
287 Token::NewtypeStruct { .. } => {
288 assert_next_token(self, Token::NewtypeStruct { name })?;
289 visitor.visit_newtype_struct(self)
290 }
291 _ => self.deserialize_any(visitor),
292 }
293 }
294
deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,295 fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Error>
296 where
297 V: Visitor<'de>,
298 {
299 match self.peek_token()? {
300 Token::Unit | Token::UnitStruct { .. } => {
301 self.next_token()?;
302 visitor.visit_unit()
303 }
304 Token::Seq { .. } => {
305 self.next_token()?;
306 self.visit_seq(Some(len), Token::SeqEnd, visitor)
307 }
308 Token::Tuple { .. } => {
309 self.next_token()?;
310 self.visit_seq(Some(len), Token::TupleEnd, visitor)
311 }
312 Token::TupleStruct { .. } => {
313 self.next_token()?;
314 self.visit_seq(Some(len), Token::TupleStructEnd, visitor)
315 }
316 _ => self.deserialize_any(visitor),
317 }
318 }
319
deserialize_tuple_struct<V>( self, name: &'static str, len: usize, visitor: V, ) -> Result<V::Value, Error> where V: Visitor<'de>,320 fn deserialize_tuple_struct<V>(
321 self,
322 name: &'static str,
323 len: usize,
324 visitor: V,
325 ) -> Result<V::Value, Error>
326 where
327 V: Visitor<'de>,
328 {
329 match self.peek_token()? {
330 Token::Unit => {
331 self.next_token()?;
332 visitor.visit_unit()
333 }
334 Token::UnitStruct { .. } => {
335 assert_next_token(self, Token::UnitStruct { name })?;
336 visitor.visit_unit()
337 }
338 Token::Seq { .. } => {
339 self.next_token()?;
340 self.visit_seq(Some(len), Token::SeqEnd, visitor)
341 }
342 Token::Tuple { .. } => {
343 self.next_token()?;
344 self.visit_seq(Some(len), Token::TupleEnd, visitor)
345 }
346 Token::TupleStruct { len: n, .. } => {
347 assert_next_token(self, Token::TupleStruct { name, len: n })?;
348 self.visit_seq(Some(len), Token::TupleStructEnd, visitor)
349 }
350 _ => self.deserialize_any(visitor),
351 }
352 }
353
deserialize_struct<V>( self, name: &'static str, fields: &'static [&'static str], visitor: V, ) -> Result<V::Value, Error> where V: Visitor<'de>,354 fn deserialize_struct<V>(
355 self,
356 name: &'static str,
357 fields: &'static [&'static str],
358 visitor: V,
359 ) -> Result<V::Value, Error>
360 where
361 V: Visitor<'de>,
362 {
363 match self.peek_token()? {
364 Token::Struct { len: n, .. } => {
365 assert_next_token(self, Token::Struct { name, len: n })?;
366 self.visit_map(Some(fields.len()), Token::StructEnd, visitor)
367 }
368 Token::Map { .. } => {
369 self.next_token()?;
370 self.visit_map(Some(fields.len()), Token::MapEnd, visitor)
371 }
372 _ => self.deserialize_any(visitor),
373 }
374 }
375
is_human_readable(&self) -> bool376 fn is_human_readable(&self) -> bool {
377 panic!(
378 "Types which have different human-readable and compact representations \
379 must explicitly mark their test cases with `serde_test::Configure`"
380 );
381 }
382 }
383
384 //////////////////////////////////////////////////////////////////////////
385
386 struct DeserializerSeqVisitor<'a, 'de: 'a> {
387 de: &'a mut Deserializer<'de>,
388 len: Option<usize>,
389 end: Token,
390 }
391
392 impl<'de, 'a> SeqAccess<'de> for DeserializerSeqVisitor<'a, 'de> {
393 type Error = Error;
394
next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error> where T: DeserializeSeed<'de>,395 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Error>
396 where
397 T: DeserializeSeed<'de>,
398 {
399 if self.de.peek_token_opt() == Some(self.end) {
400 return Ok(None);
401 }
402 self.len = self.len.map(|len| len.saturating_sub(1));
403 seed.deserialize(&mut *self.de).map(Some)
404 }
405
size_hint(&self) -> Option<usize>406 fn size_hint(&self) -> Option<usize> {
407 self.len
408 }
409 }
410
411 //////////////////////////////////////////////////////////////////////////
412
413 struct DeserializerMapVisitor<'a, 'de: 'a> {
414 de: &'a mut Deserializer<'de>,
415 len: Option<usize>,
416 end: Token,
417 }
418
419 impl<'de, 'a> MapAccess<'de> for DeserializerMapVisitor<'a, 'de> {
420 type Error = Error;
421
next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error> where K: DeserializeSeed<'de>,422 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
423 where
424 K: DeserializeSeed<'de>,
425 {
426 if self.de.peek_token_opt() == Some(self.end) {
427 return Ok(None);
428 }
429 self.len = self.len.map(|len| len.saturating_sub(1));
430 seed.deserialize(&mut *self.de).map(Some)
431 }
432
next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error> where V: DeserializeSeed<'de>,433 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error>
434 where
435 V: DeserializeSeed<'de>,
436 {
437 seed.deserialize(&mut *self.de)
438 }
439
size_hint(&self) -> Option<usize>440 fn size_hint(&self) -> Option<usize> {
441 self.len
442 }
443 }
444
445 //////////////////////////////////////////////////////////////////////////
446
447 struct DeserializerEnumVisitor<'a, 'de: 'a> {
448 de: &'a mut Deserializer<'de>,
449 }
450
451 impl<'de, 'a> EnumAccess<'de> for DeserializerEnumVisitor<'a, 'de> {
452 type Error = Error;
453 type Variant = Self;
454
variant_seed<V>(self, seed: V) -> Result<(V::Value, Self), Error> where V: DeserializeSeed<'de>,455 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self), Error>
456 where
457 V: DeserializeSeed<'de>,
458 {
459 match self.de.peek_token()? {
460 Token::UnitVariant { variant: v, .. }
461 | Token::NewtypeVariant { variant: v, .. }
462 | Token::TupleVariant { variant: v, .. }
463 | Token::StructVariant { variant: v, .. } => {
464 let de = v.into_deserializer();
465 let value = seed.deserialize(de)?;
466 Ok((value, self))
467 }
468 _ => {
469 let value = seed.deserialize(&mut *self.de)?;
470 Ok((value, self))
471 }
472 }
473 }
474 }
475
476 impl<'de, 'a> VariantAccess<'de> for DeserializerEnumVisitor<'a, 'de> {
477 type Error = Error;
478
unit_variant(self) -> Result<(), Error>479 fn unit_variant(self) -> Result<(), Error> {
480 match self.de.peek_token()? {
481 Token::UnitVariant { .. } => {
482 self.de.next_token()?;
483 Ok(())
484 }
485 _ => Deserialize::deserialize(self.de),
486 }
487 }
488
newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error> where T: DeserializeSeed<'de>,489 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
490 where
491 T: DeserializeSeed<'de>,
492 {
493 match self.de.peek_token()? {
494 Token::NewtypeVariant { .. } => {
495 self.de.next_token()?;
496 seed.deserialize(self.de)
497 }
498 _ => seed.deserialize(self.de),
499 }
500 }
501
tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, Error> where V: Visitor<'de>,502 fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, Error>
503 where
504 V: Visitor<'de>,
505 {
506 match self.de.peek_token()? {
507 Token::TupleVariant { len: enum_len, .. } => {
508 let token = self.de.next_token()?;
509
510 if len == enum_len {
511 self.de
512 .visit_seq(Some(len), Token::TupleVariantEnd, visitor)
513 } else {
514 Err(unexpected(token))
515 }
516 }
517 Token::Seq {
518 len: Some(enum_len),
519 } => {
520 let token = self.de.next_token()?;
521
522 if len == enum_len {
523 self.de.visit_seq(Some(len), Token::SeqEnd, visitor)
524 } else {
525 Err(unexpected(token))
526 }
527 }
528 _ => de::Deserializer::deserialize_any(self.de, visitor),
529 }
530 }
531
struct_variant<V>( self, fields: &'static [&'static str], visitor: V, ) -> Result<V::Value, Error> where V: Visitor<'de>,532 fn struct_variant<V>(
533 self,
534 fields: &'static [&'static str],
535 visitor: V,
536 ) -> Result<V::Value, Error>
537 where
538 V: Visitor<'de>,
539 {
540 match self.de.peek_token()? {
541 Token::StructVariant { len: enum_len, .. } => {
542 let token = self.de.next_token()?;
543
544 if fields.len() == enum_len {
545 self.de
546 .visit_map(Some(fields.len()), Token::StructVariantEnd, visitor)
547 } else {
548 Err(unexpected(token))
549 }
550 }
551 Token::Map {
552 len: Some(enum_len),
553 } => {
554 let token = self.de.next_token()?;
555
556 if fields.len() == enum_len {
557 self.de
558 .visit_map(Some(fields.len()), Token::MapEnd, visitor)
559 } else {
560 Err(unexpected(token))
561 }
562 }
563 _ => de::Deserializer::deserialize_any(self.de, visitor),
564 }
565 }
566 }
567
568 //////////////////////////////////////////////////////////////////////////
569
570 struct EnumMapVisitor<'a, 'de: 'a> {
571 de: &'a mut Deserializer<'de>,
572 variant: Option<Token>,
573 format: EnumFormat,
574 }
575
576 enum EnumFormat {
577 Seq,
578 Map,
579 Any,
580 }
581
582 impl<'a, 'de> EnumMapVisitor<'a, 'de> {
new(de: &'a mut Deserializer<'de>, variant: Token, format: EnumFormat) -> Self583 fn new(de: &'a mut Deserializer<'de>, variant: Token, format: EnumFormat) -> Self {
584 EnumMapVisitor {
585 de,
586 variant: Some(variant),
587 format,
588 }
589 }
590 }
591
592 impl<'de, 'a> MapAccess<'de> for EnumMapVisitor<'a, 'de> {
593 type Error = Error;
594
next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error> where K: DeserializeSeed<'de>,595 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>, Error>
596 where
597 K: DeserializeSeed<'de>,
598 {
599 match self.variant.take() {
600 Some(Token::Str(variant)) => seed.deserialize(variant.into_deserializer()).map(Some),
601 Some(Token::Bytes(variant)) => seed
602 .deserialize(BytesDeserializer { value: variant })
603 .map(Some),
604 Some(Token::U32(variant)) => seed.deserialize(variant.into_deserializer()).map(Some),
605 Some(other) => Err(unexpected(other)),
606 None => Ok(None),
607 }
608 }
609
next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error> where V: DeserializeSeed<'de>,610 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value, Error>
611 where
612 V: DeserializeSeed<'de>,
613 {
614 match self.format {
615 EnumFormat::Seq => {
616 let value = {
617 let visitor = DeserializerSeqVisitor {
618 de: self.de,
619 len: None,
620 end: Token::TupleVariantEnd,
621 };
622 seed.deserialize(SeqAccessDeserializer::new(visitor))?
623 };
624 assert_next_token(self.de, Token::TupleVariantEnd)?;
625 Ok(value)
626 }
627 EnumFormat::Map => {
628 let value = {
629 let visitor = DeserializerMapVisitor {
630 de: self.de,
631 len: None,
632 end: Token::StructVariantEnd,
633 };
634 seed.deserialize(MapAccessDeserializer::new(visitor))?
635 };
636 assert_next_token(self.de, Token::StructVariantEnd)?;
637 Ok(value)
638 }
639 EnumFormat::Any => seed.deserialize(&mut *self.de),
640 }
641 }
642 }
643
644 struct BytesDeserializer {
645 value: &'static [u8],
646 }
647
648 impl<'de> de::Deserializer<'de> for BytesDeserializer {
649 type Error = Error;
650
deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error> where V: de::Visitor<'de>,651 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
652 where
653 V: de::Visitor<'de>,
654 {
655 visitor.visit_bytes(self.value)
656 }
657
658 forward_to_deserialize_any! {
659 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
660 bytes byte_buf option unit unit_struct newtype_struct seq tuple
661 tuple_struct map struct enum identifier ignored_any
662 }
663 }
664