From 2a2dcf6801ca10304a1fdb44dd8252daa2a68c76 Mon Sep 17 00:00:00 2001 From: Jimmy Cuadra Date: Tue, 6 Aug 2019 15:07:38 -0700 Subject: [PATCH] impl Deserialize for m.room.name --- src/room/name.rs | 95 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 83 insertions(+), 12 deletions(-) diff --git a/src/room/name.rs b/src/room/name.rs index ebbb7b60..96f27fa8 100644 --- a/src/room/name.rs +++ b/src/room/name.rs @@ -4,12 +4,12 @@ use std::{convert::TryFrom, str::FromStr}; use js_int::UInt; use ruma_identifiers::{EventId, RoomId, UserId}; -use serde::{ser::SerializeStruct, Deserialize, Serialize, Serializer}; +use serde::{ser::SerializeStruct, Deserialize, Deserializer, Serialize, Serializer}; use serde_json::Value; use crate::{ - empty_string_as_none, Event, EventType, InnerInvalidEvent, InvalidEvent, InvalidInput, - RoomEvent, StateEvent, + empty_string_as_none, Event, EventResult, EventType, InnerInvalidEvent, InvalidEvent, + InvalidInput, RoomEvent, StateEvent, }; /// A human-friendly room name designed to be displayed to the end-user. @@ -48,6 +48,42 @@ pub struct NameEventContent { pub(crate) name: Option, } +impl<'de> Deserialize<'de> for EventResult { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let json = serde_json::Value::deserialize(deserializer)?; + + let raw: raw::NameEvent = match serde_json::from_value(json.clone()) { + Ok(raw) => raw, + Err(error) => { + return Ok(EventResult::Err(InvalidEvent( + InnerInvalidEvent::Validation { + json, + message: error.to_string(), + }, + ))); + } + }; + + Ok(EventResult::Ok(NameEvent { + content: NameEventContent { + name: raw.content.name, + }, + event_id: raw.event_id, + origin_server_ts: raw.origin_server_ts, + prev_content: raw + .prev_content + .map(|prev| NameEventContent { name: prev.name }), + room_id: raw.room_id, + sender: raw.sender, + state_key: raw.state_key, + unsigned: raw.unsigned, + })) + } +} + impl FromStr for NameEvent { type Err = InvalidEvent; @@ -163,6 +199,29 @@ impl NameEventContent { } } +impl<'de> Deserialize<'de> for EventResult { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let json = serde_json::Value::deserialize(deserializer)?; + + let raw: raw::NameEventContent = match serde_json::from_value(json.clone()) { + Ok(raw) => raw, + Err(error) => { + return Ok(EventResult::Err(InvalidEvent( + InnerInvalidEvent::Validation { + json, + message: error.to_string(), + }, + ))); + } + }; + + Ok(EventResult::Ok(NameEventContent { name: raw.name })) + } +} + impl FromStr for NameEventContent { type Err = InvalidEvent; @@ -248,7 +307,7 @@ mod tests { use ruma_identifiers::{EventId, RoomId, UserId}; use serde_json::Value; - use super::{NameEvent, NameEventContent}; + use super::{EventResult, NameEvent, NameEventContent}; #[test] fn serialization_with_optional_fields_as_none() { @@ -297,8 +356,11 @@ mod tests { #[test] fn absent_field_as_none() { assert_eq!( - r#"{"content":{},"event_id":"$h29iv0s8:example.com","origin_server_ts":1,"sender":"@carl:example.com","state_key":"","type":"m.room.name"}"# - .parse::() + serde_json::from_str::>( + r#"{"content":{},"event_id":"$h29iv0s8:example.com","origin_server_ts":1,"sender":"@carl:example.com","state_key":"","type":"m.room.name"}"# + ) + .unwrap() + .into_result() .unwrap() .content .name, @@ -309,8 +371,11 @@ mod tests { #[test] fn null_field_as_none() { assert_eq!( - r#"{"content":{"name":null},"event_id":"$h29iv0s8:example.com","origin_server_ts":1,"sender":"@carl:example.com","state_key":"","type":"m.room.name"}"# - .parse::() + serde_json::from_str::>( + r#"{"content":{"name":null},"event_id":"$h29iv0s8:example.com","origin_server_ts":1,"sender":"@carl:example.com","state_key":"","type":"m.room.name"}"# + ) + .unwrap() + .into_result() .unwrap() .content .name, @@ -321,8 +386,11 @@ mod tests { #[test] fn empty_string_as_none() { assert_eq!( - r#"{"content":{"name":""},"event_id":"$h29iv0s8:example.com","origin_server_ts":1,"sender":"@carl:example.com","state_key":"","type":"m.room.name"}"# - .parse::() + serde_json::from_str::>( + r#"{"content":{"name":""},"event_id":"$h29iv0s8:example.com","origin_server_ts":1,"sender":"@carl:example.com","state_key":"","type":"m.room.name"}"# + ) + .unwrap() + .into_result() .unwrap() .content .name, @@ -335,8 +403,11 @@ mod tests { let name = Some("The room name".to_string()); assert_eq!( - r#"{"content":{"name":"The room name"},"event_id":"$h29iv0s8:example.com","origin_server_ts":1,"sender":"@carl:example.com","state_key":"","type":"m.room.name"}"# - .parse::() + serde_json::from_str::>( + r#"{"content":{"name":"The room name"},"event_id":"$h29iv0s8:example.com","origin_server_ts":1,"sender":"@carl:example.com","state_key":"","type":"m.room.name"}"# + ) + .unwrap() + .into_result() .unwrap() .content .name,