diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index ed8b9438..6566fd94 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -427,7 +427,9 @@ fn deserialize_tuple( None }; - let visit_seq = Stmts(deserialize_seq(&type_path, params, fields, false, cattrs)); + let visit_seq = Stmts(deserialize_seq( + &type_path, params, fields, false, cattrs, &expecting, + )); let visitor_expr = quote! { __Visitor { @@ -511,7 +513,7 @@ fn deserialize_tuple_in_place( None }; - let visit_seq = Stmts(deserialize_seq_in_place(params, fields, cattrs)); + let visit_seq = Stmts(deserialize_seq_in_place(params, fields, cattrs, &expecting)); let visitor_expr = quote! { __Visitor { @@ -577,6 +579,7 @@ fn deserialize_seq( fields: &[Field], is_struct: bool, cattrs: &attr::Container, + expecting: &str, ) -> Fragment { let vars = (0..fields.len()).map(field_i as fn(_) -> _); @@ -586,7 +589,11 @@ fn deserialize_seq( .iter() .filter(|field| !field.attrs.skip_deserializing()) .count(); - let expecting = format!("tuple of {} elements", deserialized_count); + let expecting = if deserialized_count == 1 { + format!("{} with 1 element", expecting) + } else { + format!("{} with {} elements", expecting, deserialized_count) + }; let mut index_in_seq = 0_usize; let let_values = vars.clone().zip(fields).map(|(var, field)| { @@ -671,6 +678,7 @@ fn deserialize_seq_in_place( params: &Parameters, fields: &[Field], cattrs: &attr::Container, + expecting: &str, ) -> Fragment { let vars = (0..fields.len()).map(field_i as fn(_) -> _); @@ -680,7 +688,11 @@ fn deserialize_seq_in_place( .iter() .filter(|field| !field.attrs.skip_deserializing()) .count(); - let expecting = format!("tuple of {} elements", deserialized_count); + let expecting = if deserialized_count == 1 { + format!("{} with 1 element", expecting) + } else { + format!("{} with {} elements", expecting, deserialized_count) + }; let mut index_in_seq = 0usize; let write_values = vars.clone() @@ -852,7 +864,7 @@ fn deserialize_struct( None => format!("struct {}", params.type_name()), }; - let visit_seq = Stmts(deserialize_seq(&type_path, params, fields, true, cattrs)); + let visit_seq = Stmts(deserialize_seq(&type_path, params, fields, true, cattrs, &expecting)); let (field_visitor, fields_stmt, visit_map) = if cattrs.has_flatten() { deserialize_struct_as_map_visitor(&type_path, params, fields, cattrs) @@ -991,7 +1003,7 @@ fn deserialize_struct_in_place( None => format!("struct {}", params.type_name()), }; - let visit_seq = Stmts(deserialize_seq_in_place(params, fields, cattrs)); + let visit_seq = Stmts(deserialize_seq_in_place(params, fields, cattrs, &expecting)); let (field_visitor, fields_stmt, visit_map) = deserialize_struct_as_struct_in_place_visitor(params, fields, cattrs); diff --git a/test_suite/tests/test_annotations.rs b/test_suite/tests/test_annotations.rs index 00c3aec3..5461254f 100644 --- a/test_suite/tests/test_annotations.rs +++ b/test_suite/tests/test_annotations.rs @@ -1300,7 +1300,7 @@ fn test_invalid_length_enum() { Token::I32(1), Token::TupleVariantEnd, ], - "invalid length 1, expected tuple of 3 elements", + "invalid length 1, expected tuple variant InvalidLengthEnum::A with 3 elements", ); assert_de_tokens_error::( &[ @@ -1312,7 +1312,7 @@ fn test_invalid_length_enum() { Token::I32(1), Token::TupleVariantEnd, ], - "invalid length 1, expected tuple of 2 elements", + "invalid length 1, expected tuple variant InvalidLengthEnum::B with 2 elements", ); }