Merge pull request #18 from dr-bonez/bugfix/allow-empty-auth

better error reporting for ruma_common::serde::or_empty
This commit is contained in:
June Clementine Strawberry 🍓🦴 2025-02-18 16:54:52 -05:00 committed by GitHub
commit 5dc3e0f81d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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)]