我有两个用于serde deserialize_with
的定制函数
// Converts string to u32
pub fn de_u32_from_str<'de, D>(deserializer: D) -> Result<u32, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
s.parse::<u32>().map_err(de::Error::custom)
}
// Converts string that may be `null` to either `Some(u32)` or `None`
pub fn de_opt_u32_from_opt_str<'de, D>(deserializer: D) -> Result<Option<u32>, D::Error>
where
D: Deserializer<'de>,
{
let s = Option::<String>::deserialize(deserializer)?;
s.map(|s| s.parse::<u32>().map_err(de::Error::custom))
.transpose()
}
我测试了de_u32_from_str
个这样的人:
fn deserialize_u32_from_str(string: &str, expected: u32) {
let de: StrDeserializer<ValueError> = string.into_deserializer();
let result = de_u32_from_str(de).unwrap();
assert_eq!(result, expected);
}
然而,我很难为测试de_opt_u32_from_opt_str
创建deserializer
个
fn deserialize_opt_u32_from_opt_str(maybe_string: Option<&str>, expected: Option<u32>) {
// I need a `deserializer` here
let de: ... = ...;
let result = de_opt_u32_from_opt_str(de).unwrap();
assert_eq!(result, expected);
}
How can I create a deserializer like个
let de: StrDeserializer<ValueError> = string.into_deserializer();
but holding 100to satisfy
let s = Option::<String>::deserialize(deserializer)?;