You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
30 lines
694 B
Rust
30 lines
694 B
Rust
use serde::de::IntoDeserializer;
|
|
use serde::Deserialize;
|
|
|
|
#[derive(Deserialize)]
|
|
#[serde(untagged)]
|
|
enum FuzzyNonString<T> {
|
|
NoString(T),
|
|
String(String),
|
|
}
|
|
|
|
pub fn empty_string_as_none<'de, D, T>(de: D) -> Result<Option<T>, D::Error>
|
|
where
|
|
D: serde::Deserializer<'de>,
|
|
T: serde::Deserialize<'de>,
|
|
{
|
|
let opt = Option::<FuzzyNonString<T>>::deserialize(de)?;
|
|
|
|
match opt {
|
|
Some(FuzzyNonString::String(s)) => {
|
|
if s.is_empty() {
|
|
Ok(None)
|
|
} else {
|
|
T::deserialize(s.into_deserializer()).map(Some)
|
|
}
|
|
}
|
|
Some(FuzzyNonString::NoString(n)) => Ok(Some(n)),
|
|
None => Ok(None),
|
|
}
|
|
}
|