Fix deserializing event enums from serde_json::Value

(or anything else that's not a JSON string)
This commit is contained in:
Jonas Platte 2020-06-16 02:12:13 +02:00
parent f4665761be
commit d78cd2ed15
No known key found for this signature in database
GPG Key ID: 7D261D771D915378

View File

@ -182,23 +182,23 @@ impl<'de> de::Deserialize<'de> for AnyEvent {
where where
D: de::Deserializer<'de>, D: de::Deserializer<'de>,
{ {
let json = <&RawJsonValue>::deserialize(deserializer)?; let json = Box::<RawJsonValue>::deserialize(deserializer)?;
let EventDeHelper { ev_type } = from_raw_json_value(json)?; let EventDeHelper { ev_type } = from_raw_json_value(&json)?;
match ev_type.as_str() { match ev_type.as_str() {
"m.room.redaction" => Ok(AnyEvent::Redaction(from_raw_json_value(json)?)), "m.room.redaction" => Ok(AnyEvent::Redaction(from_raw_json_value(&json)?)),
"m.presence" => Ok(AnyEvent::Presence(from_raw_json_value(json)?)), "m.presence" => Ok(AnyEvent::Presence(from_raw_json_value(&json)?)),
ev_type if AnyBasicEventContent::is_compatible(ev_type) => { ev_type if AnyBasicEventContent::is_compatible(ev_type) => {
Ok(AnyEvent::Basic(from_raw_json_value(json)?)) Ok(AnyEvent::Basic(from_raw_json_value(&json)?))
} }
ev_type if AnyEphemeralRoomEventContent::is_compatible(ev_type) => { ev_type if AnyEphemeralRoomEventContent::is_compatible(ev_type) => {
Ok(AnyEvent::Ephemeral(from_raw_json_value(json)?)) Ok(AnyEvent::Ephemeral(from_raw_json_value(&json)?))
} }
ev_type if AnyMessageEventContent::is_compatible(ev_type) => { ev_type if AnyMessageEventContent::is_compatible(ev_type) => {
Ok(AnyEvent::Message(from_raw_json_value(json)?)) Ok(AnyEvent::Message(from_raw_json_value(&json)?))
} }
ev_type if AnyStateEventContent::is_compatible(ev_type) => { ev_type if AnyStateEventContent::is_compatible(ev_type) => {
Ok(AnyEvent::State(from_raw_json_value(json)?)) Ok(AnyEvent::State(from_raw_json_value(&json)?))
} }
_ => Err(D::Error::custom(format!("event type `{}` is not a valid event", ev_type))), _ => Err(D::Error::custom(format!("event type `{}` is not a valid event", ev_type))),
} }
@ -210,16 +210,16 @@ impl<'de> de::Deserialize<'de> for AnyRoomEvent {
where where
D: de::Deserializer<'de>, D: de::Deserializer<'de>,
{ {
let json = <&RawJsonValue>::deserialize(deserializer)?; let json = Box::<RawJsonValue>::deserialize(deserializer)?;
let EventDeHelper { ev_type } = from_raw_json_value(json)?; let EventDeHelper { ev_type } = from_raw_json_value(&json)?;
match ev_type.as_str() { match ev_type.as_str() {
"m.room.redaction" => Ok(AnyRoomEvent::Redaction(from_raw_json_value(json)?)), "m.room.redaction" => Ok(AnyRoomEvent::Redaction(from_raw_json_value(&json)?)),
ev_type if AnyMessageEventContent::is_compatible(ev_type) => { ev_type if AnyMessageEventContent::is_compatible(ev_type) => {
Ok(AnyRoomEvent::Message(from_raw_json_value(json)?)) Ok(AnyRoomEvent::Message(from_raw_json_value(&json)?))
} }
ev_type if AnyStateEventContent::is_compatible(ev_type) => { ev_type if AnyStateEventContent::is_compatible(ev_type) => {
Ok(AnyRoomEvent::State(from_raw_json_value(json)?)) Ok(AnyRoomEvent::State(from_raw_json_value(&json)?))
} }
_ => Err(D::Error::custom(format!("event type `{}` is not a valid event", ev_type))), _ => Err(D::Error::custom(format!("event type `{}` is not a valid event", ev_type))),
} }
@ -231,16 +231,16 @@ impl<'de> de::Deserialize<'de> for AnyRoomEventStub {
where where
D: de::Deserializer<'de>, D: de::Deserializer<'de>,
{ {
let json = <&RawJsonValue>::deserialize(deserializer)?; let json = Box::<RawJsonValue>::deserialize(deserializer)?;
let EventDeHelper { ev_type } = from_raw_json_value(json)?; let EventDeHelper { ev_type } = from_raw_json_value(&json)?;
match ev_type.as_str() { match ev_type.as_str() {
"m.room.redaction" => Ok(AnyRoomEventStub::Redaction(from_raw_json_value(json)?)), "m.room.redaction" => Ok(AnyRoomEventStub::Redaction(from_raw_json_value(&json)?)),
ev_type if AnyMessageEventContent::is_compatible(ev_type) => { ev_type if AnyMessageEventContent::is_compatible(ev_type) => {
Ok(AnyRoomEventStub::Message(from_raw_json_value(json)?)) Ok(AnyRoomEventStub::Message(from_raw_json_value(&json)?))
} }
ev_type if AnyStateEventContent::is_compatible(ev_type) => { ev_type if AnyStateEventContent::is_compatible(ev_type) => {
Ok(AnyRoomEventStub::State(from_raw_json_value(json)?)) Ok(AnyRoomEventStub::State(from_raw_json_value(&json)?))
} }
_ => Err(D::Error::custom(format!("event type `{}` is not a valid event", ev_type))), _ => Err(D::Error::custom(format!("event type `{}` is not a valid event", ev_type))),
} }