Use more consistent error messages for bad flattening

This commit is contained in:
Armin Ronacher 2018-03-18 23:46:28 +01:00
parent c5a3128492
commit 7cf184624a
3 changed files with 38 additions and 6 deletions

View File

@ -2095,7 +2095,7 @@ impl<'a, 'de, E> Deserializer<'de> for FlatMapDeserializer<'a, 'de, E>
where where
V: Visitor<'de>, V: Visitor<'de>,
{ {
Err(Error::custom("can only flatten structs, maps and struct enum variants")) Err(Error::custom("can only flatten structs and maps"))
} }
fn deserialize_enum<V>( fn deserialize_enum<V>(

View File

@ -1043,9 +1043,7 @@ where
M: SerializeMap + 'a M: SerializeMap + 'a
{ {
fn bad_type(self, what: Unsupported) -> M::Error { fn bad_type(self, what: Unsupported) -> M::Error {
ser::Error::custom(format_args!( ser::Error::custom(format_args!("can only flatten structs and maps (got {})", what))
"cannot flatten serialize {} values", what
))
} }
} }

View File

@ -17,8 +17,8 @@ use self::serde::{Deserialize, Deserializer, Serialize, Serializer};
use self::serde::de::{self, Unexpected}; use self::serde::de::{self, Unexpected};
extern crate serde_test; extern crate serde_test;
use self::serde_test::{assert_de_tokens, assert_de_tokens_error, assert_ser_tokens, assert_tokens, use self::serde_test::{assert_de_tokens, assert_de_tokens_error, assert_ser_tokens,
Token}; assert_ser_tokens_error, assert_tokens, Token};
trait MyDefault: Sized { trait MyDefault: Sized {
fn my_default() -> Self; fn my_default() -> Self;
@ -1636,3 +1636,37 @@ fn test_complex_flatten() {
], ],
); );
} }
#[test]
fn test_flatten_unsupported_type() {
#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct Outer {
outer: String,
#[serde(flatten)]
inner: String,
}
assert_ser_tokens_error(
&Outer {
outer: "foo".into(),
inner: "bar".into(),
},
&[
Token::Map { len: None },
Token::Str("outer"),
Token::Str("foo"),
],
"can only flatten structs and maps (got a string)",
);
assert_de_tokens_error::<Outer>(
&[
Token::Map { len: None },
Token::Str("outer"),
Token::Str("foo"),
Token::Str("a"),
Token::Str("b"),
Token::MapEnd
],
"can only flatten structs and maps",
);
}