#[test]
fn custom_error_has_location() {
#[derive(Debug,Eq,Ord,PartialEq,PartialOrd)]
struct Even(u32);
impl<'d> serde::Deserialize<'d> for Even {
fn deserialize<D: serde::Deserializer<'d>>(d: D) -> Result<Self, D::Error> {
let n = u32::deserialize(d)?;
if n % 2 != 0 {
return Err(serde::de::Error::custom(format!("{} is not even", n)));
}
Ok(Even(n))
}
}
#[derive(Debug,serde::Deserialize)]
struct Test {
_a: Even,
_b: Even,
}
let e = crate::from_bytes::<Test, _>("\
_a: 2
_b: 3
").unwrap_err();
assert_eq!(e.to_string(), "3 is not even at 2:4");
let e = crate::from_bytes::<Even, _>("5").unwrap_err();
assert_eq!(e.to_string(), "5 is not even at 1:1");
let e = crate::from_bytes::<Vec<Even>, _>("\
2
4
7
8
").unwrap_err();
assert_eq!(e.to_string(), "7 is not even at 3:1");
#[derive(Debug,serde::Deserialize)]
#[allow(dead_code)]
struct OptTest {
maybe: Option<Even>,
}
let e = crate::from_bytes::<OptTest, _>("\
maybe: 9
").unwrap_err();
assert_eq!(e.to_string(), "9 is not even at 1:7");
#[derive(Debug,serde::Deserialize)]
#[allow(dead_code)]
enum Wrap {
V(Even),
}
let e = crate::from_bytes::<Wrap, _>("\
V: 11
").unwrap_err();
assert_eq!(e.to_string(), "11 is not even at 1:3");
let e = crate::from_bytes::<std::collections::BTreeMap<Even, u32>, _>("\
2: 0
13: 0
").unwrap_err();
assert_eq!(e.to_string(), "13 is not even at 2:1");
}
#[test]
fn empty_struct() {
#[derive(Debug,PartialEq,serde::Deserialize)]
struct Test {
#[serde(default)]
list: Vec<i32>,
#[serde(default)]
number: Option<u8>,
#[serde(default)]
string: String,
#[serde(default)]
unit: (),
}
let t: Test = crate::from_bytes("").unwrap();
assert_eq!(t, Test{
list: Default::default(),
number: Default::default(),
string: Default::default(),
unit: Default::default(),
});
let t: String = crate::from_bytes(" ").unwrap();
assert_eq!(t, "");
let t: Vec<u8> = crate::from_bytes(" \n \n \n \n\n \n").unwrap();
assert_eq!(t, vec![]);
}