mirror of
https://github.com/girlbossceo/ruwuma.git
synced 2025-04-29 06:49:48 -04:00
better error reporting
This commit is contained in:
parent
4b3a925683
commit
599fb39100
1 changed files with 17 additions and 8 deletions
|
@ -70,17 +70,26 @@ pub fn is_true(b: &bool) -> bool {
|
|||
}
|
||||
|
||||
/// Returns None if the serialization fails
|
||||
pub fn or_empty<'de, D: Deserializer<'de>, T: Deserialize<'de>>(
|
||||
pub fn or_empty<'de, D: Deserializer<'de>, T: for <'a> Deserialize<'a>>(
|
||||
deserializer: D,
|
||||
) -> Result<Option<T>, D::Error> {
|
||||
#[derive(serde::Deserialize)]
|
||||
#[serde(untagged)]
|
||||
enum OrEmpty<T> {
|
||||
NotEmpty(T),
|
||||
Empty {},
|
||||
let json = Box::<RawJsonValue>::deserialize(deserializer)?;
|
||||
|
||||
let res = serde_json::from_str::<Option<T>>(json.get()).map_err(de::Error::custom);
|
||||
|
||||
match res {
|
||||
Ok(a) => Ok(a),
|
||||
Err(e) => {
|
||||
#[derive(Deserialize)]
|
||||
#[serde(deny_unknown_fields)]
|
||||
struct Empty {};
|
||||
if let Ok(Empty {}) = serde_json::from_str(json.get()) {
|
||||
Ok(None)
|
||||
} else {
|
||||
Err(e)
|
||||
}
|
||||
}
|
||||
}
|
||||
let res = <Option<OrEmpty<T>> as Deserialize<'de>>::deserialize(deserializer)?;
|
||||
Ok(res.and_then(|res| if let OrEmpty::NotEmpty(a) = res { Some(a) } else { None }))
|
||||
}
|
||||
/// Helper function for `serde_json::value::RawValue` deserialization.
|
||||
#[inline(never)]
|
||||
|
|
Loading…
Add table
Reference in a new issue