impl Deserialize for m.ignored_user_list

This commit is contained in:
Jimmy Cuadra 2019-08-06 14:45:18 -07:00
parent 685a61954c
commit c69e1c6204

View File

@ -3,9 +3,9 @@
use std::{collections::HashMap, convert::TryFrom, str::FromStr}; use std::{collections::HashMap, convert::TryFrom, str::FromStr};
use ruma_identifiers::UserId; use ruma_identifiers::UserId;
use serde::{ser::SerializeStruct, Deserialize, Serialize, Serializer}; use serde::{ser::SerializeStruct, Deserialize, Deserializer, Serialize, Serializer};
use crate::{Empty, Event, EventType, InnerInvalidEvent, InvalidEvent}; use crate::{Empty, Event, EventResult, EventType, InnerInvalidEvent, InvalidEvent};
/// A list of users to ignore. /// A list of users to ignore.
#[derive(Clone, Debug, PartialEq)] #[derive(Clone, Debug, PartialEq)]
@ -21,6 +21,33 @@ pub struct IgnoredUserListEventContent {
pub ignored_users: Vec<UserId>, pub ignored_users: Vec<UserId>,
} }
impl<'de> Deserialize<'de> for EventResult<IgnoredUserListEvent> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let json = serde_json::Value::deserialize(deserializer)?;
let raw: raw::IgnoredUserListEvent = 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(IgnoredUserListEvent {
content: IgnoredUserListEventContent {
ignored_users: raw.content.ignored_users.keys().cloned().collect(),
},
}))
}
}
impl FromStr for IgnoredUserListEvent { impl FromStr for IgnoredUserListEvent {
type Err = InvalidEvent; type Err = InvalidEvent;
@ -78,6 +105,31 @@ impl_event!(
EventType::IgnoredUserList EventType::IgnoredUserList
); );
impl<'de> Deserialize<'de> for EventResult<IgnoredUserListEventContent> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let json = serde_json::Value::deserialize(deserializer)?;
let raw: raw::IgnoredUserListEventContent = 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(IgnoredUserListEventContent {
ignored_users: raw.ignored_users.keys().cloned().collect(),
}))
}
}
impl FromStr for IgnoredUserListEventContent { impl FromStr for IgnoredUserListEventContent {
type Err = InvalidEvent; type Err = InvalidEvent;
@ -155,7 +207,7 @@ mod tests {
use ruma_identifiers::UserId; use ruma_identifiers::UserId;
use super::{IgnoredUserListEvent, IgnoredUserListEventContent}; use super::{EventResult, IgnoredUserListEvent, IgnoredUserListEventContent};
#[test] #[test]
fn serialization() { fn serialization() {
@ -174,7 +226,10 @@ mod tests {
fn deserialization() { fn deserialization() {
let json = r#"{"content":{"ignored_users":{"@carl:example.com":{}}},"type":"m.ignored_user_list"}"#; let json = r#"{"content":{"ignored_users":{"@carl:example.com":{}}},"type":"m.ignored_user_list"}"#;
let actual: IgnoredUserListEvent = json.parse().unwrap(); let actual = serde_json::from_str::<EventResult<IgnoredUserListEvent>>(json)
.unwrap()
.into_result()
.unwrap();
let expected = IgnoredUserListEvent { let expected = IgnoredUserListEvent {
content: IgnoredUserListEventContent { content: IgnoredUserListEventContent {