From a9b5cc483022c4b1f00cc241b52f68f80529b163 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sat, 28 Jan 2017 15:00:54 -0800 Subject: [PATCH] Fix invalid_length message for tuples and arrays --- serde/src/de/impls.rs | 104 ++++++++++++++++++------------------ test_suite/tests/test_de.rs | 20 ++++++- 2 files changed, 71 insertions(+), 53 deletions(-) diff --git a/serde/src/de/impls.rs b/serde/src/de/impls.rs index d28dba02..84b98f10 100644 --- a/serde/src/de/impls.rs +++ b/serde/src/de/impls.rs @@ -574,7 +574,7 @@ impl Deserialize for [T; 0] } macro_rules! array_impls { - ($($len:expr => ($($name:ident)+))+) => { + ($($len:expr => ($($n:tt $name:ident)+))+) => { $( impl Visitor for ArrayVisitor<[T; $len]> where T: Deserialize { type Value = [T; $len]; @@ -590,7 +590,7 @@ macro_rules! array_impls { $( let $name = match try!(visitor.visit()) { Some(val) => val, - None => return Err(Error::invalid_length(0, &self)), + None => return Err(Error::invalid_length($n, &self)), }; )+ @@ -612,44 +612,44 @@ macro_rules! array_impls { } array_impls! { - 1 => (a) - 2 => (a b) - 3 => (a b c) - 4 => (a b c d) - 5 => (a b c d e) - 6 => (a b c d e f) - 7 => (a b c d e f g) - 8 => (a b c d e f g h) - 9 => (a b c d e f g h i) - 10 => (a b c d e f g h i j) - 11 => (a b c d e f g h i j k) - 12 => (a b c d e f g h i j k l) - 13 => (a b c d e f g h i j k l m) - 14 => (a b c d e f g h i j k l m n) - 15 => (a b c d e f g h i j k l m n o) - 16 => (a b c d e f g h i j k l m n o p) - 17 => (a b c d e f g h i j k l m n o p q) - 18 => (a b c d e f g h i j k l m n o p q r) - 19 => (a b c d e f g h i j k l m n o p q r s) - 20 => (a b c d e f g h i j k l m n o p q r s t) - 21 => (a b c d e f g h i j k l m n o p q r s t u) - 22 => (a b c d e f g h i j k l m n o p q r s t u v) - 23 => (a b c d e f g h i j k l m n o p q r s t u v w) - 24 => (a b c d e f g h i j k l m n o p q r s t u v w x) - 25 => (a b c d e f g h i j k l m n o p q r s t u v w x y) - 26 => (a b c d e f g h i j k l m n o p q r s t u v w x y z) - 27 => (a b c d e f g h i j k l m n o p q r s t u v w x y z aa) - 28 => (a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab) - 29 => (a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac) - 30 => (a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad) - 31 => (a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae) - 32 => (a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af) + 1 => (0 a) + 2 => (0 a 1 b) + 3 => (0 a 1 b 2 c) + 4 => (0 a 1 b 2 c 3 d) + 5 => (0 a 1 b 2 c 3 d 4 e) + 6 => (0 a 1 b 2 c 3 d 4 e 5 f) + 7 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g) + 8 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h) + 9 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i) + 10 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j) + 11 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k) + 12 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l) + 13 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m) + 14 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n) + 15 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o) + 16 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p) + 17 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q) + 18 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r) + 19 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s) + 20 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t) + 21 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u) + 22 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v) + 23 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v 22 w) + 24 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v 22 w 23 x) + 25 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v 22 w 23 x 24 y) + 26 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v 22 w 23 x 24 y 25 z) + 27 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v 22 w 23 x 24 y 25 z 26 aa) + 28 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v 22 w 23 x 24 y 25 z 26 aa 27 ab) + 29 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v 22 w 23 x 24 y 25 z 26 aa 27 ab 28 ac) + 30 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v 22 w 23 x 24 y 25 z 26 aa 27 ab 28 ac 29 ad) + 31 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v 22 w 23 x 24 y 25 z 26 aa 27 ab 28 ac 29 ad 30 ae) + 32 => (0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 k 11 l 12 m 13 n 14 o 15 p 16 q 17 r 18 s 19 t 20 u 21 v 22 w 23 x 24 y 25 z 26 aa 27 ab 28 ac 29 ad 30 ae 31 af) } /////////////////////////////////////////////////////////////////////////////// macro_rules! tuple_impls { - ($($len:expr => $visitor:ident => ($($name:ident)+))+) => { + ($($len:expr => $visitor:ident => ($($n:tt $name:ident)+))+) => { $( /// Construct a tuple visitor. pub struct $visitor<$($name,)+> { @@ -678,7 +678,7 @@ macro_rules! tuple_impls { $( let $name = match try!(visitor.visit()) { Some(value) => value, - None => return Err(Error::invalid_length(0, &self)), + None => return Err(Error::invalid_length($n, &self)), }; )+ @@ -699,22 +699,22 @@ macro_rules! tuple_impls { } tuple_impls! { - 1 => TupleVisitor1 => (T0) - 2 => TupleVisitor2 => (T0 T1) - 3 => TupleVisitor3 => (T0 T1 T2) - 4 => TupleVisitor4 => (T0 T1 T2 T3) - 5 => TupleVisitor5 => (T0 T1 T2 T3 T4) - 6 => TupleVisitor6 => (T0 T1 T2 T3 T4 T5) - 7 => TupleVisitor7 => (T0 T1 T2 T3 T4 T5 T6) - 8 => TupleVisitor8 => (T0 T1 T2 T3 T4 T5 T6 T7) - 9 => TupleVisitor9 => (T0 T1 T2 T3 T4 T5 T6 T7 T8) - 10 => TupleVisitor10 => (T0 T1 T2 T3 T4 T5 T6 T7 T8 T9) - 11 => TupleVisitor11 => (T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10) - 12 => TupleVisitor12 => (T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11) - 13 => TupleVisitor13 => (T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12) - 14 => TupleVisitor14 => (T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13) - 15 => TupleVisitor15 => (T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14) - 16 => TupleVisitor16 => (T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 T11 T12 T13 T14 T15) + 1 => TupleVisitor1 => (0 T0) + 2 => TupleVisitor2 => (0 T0 1 T1) + 3 => TupleVisitor3 => (0 T0 1 T1 2 T2) + 4 => TupleVisitor4 => (0 T0 1 T1 2 T2 3 T3) + 5 => TupleVisitor5 => (0 T0 1 T1 2 T2 3 T3 4 T4) + 6 => TupleVisitor6 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5) + 7 => TupleVisitor7 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6) + 8 => TupleVisitor8 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7) + 9 => TupleVisitor9 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8) + 10 => TupleVisitor10 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9) + 11 => TupleVisitor11 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10) + 12 => TupleVisitor12 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11) + 13 => TupleVisitor13 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12) + 14 => TupleVisitor14 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13) + 15 => TupleVisitor15 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14) + 16 => TupleVisitor16 => (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15) } /////////////////////////////////////////////////////////////////////////////// diff --git a/test_suite/tests/test_de.rs b/test_suite/tests/test_de.rs index 97481b59..b748bb12 100644 --- a/test_suite/tests/test_de.rs +++ b/test_suite/tests/test_de.rs @@ -97,7 +97,7 @@ macro_rules! declare_tests { } macro_rules! declare_error_tests { - ($($name:ident<$target:ident> { $tokens:expr, $expected:expr, })+) => { + ($($name:ident<$target:ty> { $tokens:expr, $expected:expr, })+) => { $( #[test] fn $name() { @@ -936,4 +936,22 @@ declare_error_tests! { ], Error::Message("invalid value: integer `4`, expected variant index 0 <= i < 4".into()), } + test_short_tuple<(u8, u8, u8)> { + &[ + Token::TupleStart(1), + Token::TupleSep, + Token::U8(1), + Token::TupleEnd, + ], + Error::Message("invalid length 1, expected a tuple of size 3".into()), + } + test_short_array<[u8; 3]> { + &[ + Token::SeqStart(Some(1)), + Token::SeqSep, + Token::U8(1), + Token::SeqEnd, + ], + Error::Message("invalid length 1, expected an array of length 3".into()), + } }