Implement Deserialize for EventType.
This commit is contained in:
parent
ee781c72b7
commit
145221eace
72
src/lib.rs
72
src/lib.rs
@ -1,7 +1,7 @@
|
|||||||
//! Crate ruma_events contains serializable types for the events in the [Matrix](https://matrix.org)
|
//! Crate ruma_events contains serializable types for the events in the [Matrix](https://matrix.org)
|
||||||
//! specification that can be shared by client and server code.
|
//! specification that can be shared by client and server code.
|
||||||
|
|
||||||
#![feature(custom_derive, plugin)]
|
#![feature(custom_derive, plugin, question_mark)]
|
||||||
#![plugin(serde_macros)]
|
#![plugin(serde_macros)]
|
||||||
#![deny(missing_docs)]
|
#![deny(missing_docs)]
|
||||||
|
|
||||||
@ -12,7 +12,8 @@ extern crate serde_json;
|
|||||||
use std::fmt::{Display, Formatter, Error as FmtError};
|
use std::fmt::{Display, Formatter, Error as FmtError};
|
||||||
|
|
||||||
use ruma_identifiers::{EventId, RoomId, UserId};
|
use ruma_identifiers::{EventId, RoomId, UserId};
|
||||||
use serde::{Deserialize, Serialize, Serializer};
|
use serde::{Deserialize, Deserializer, Error as SerdeError, Serialize, Serializer};
|
||||||
|
use serde::de::Visitor;
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
|
|
||||||
pub mod call;
|
pub mod call;
|
||||||
@ -24,7 +25,7 @@ pub mod tag;
|
|||||||
pub mod typing;
|
pub mod typing;
|
||||||
|
|
||||||
/// The type of an event.
|
/// The type of an event.
|
||||||
#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq)]
|
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
|
||||||
pub enum EventType {
|
pub enum EventType {
|
||||||
/// m.call.answer
|
/// m.call.answer
|
||||||
CallAnswer,
|
CallAnswer,
|
||||||
@ -183,15 +184,62 @@ impl Display for EventType {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<'a> From<&'a str> for EventType {
|
||||||
|
fn from(s: &'a str) -> EventType {
|
||||||
|
match s {
|
||||||
|
"m.call.answer" => EventType::CallAnswer,
|
||||||
|
"m.call.candidates" => EventType::CallCandidates,
|
||||||
|
"m.call.hangup" => EventType::CallHangup,
|
||||||
|
"m.call.invite" => EventType::CallInvite,
|
||||||
|
"m.presence" => EventType::Presence,
|
||||||
|
"m.receipt" => EventType::Receipt,
|
||||||
|
"m.room.aliases" => EventType::RoomAliases,
|
||||||
|
"m.room.avatar" => EventType::RoomAvatar,
|
||||||
|
"m.room.canonical_alias" => EventType::RoomCanonicalAlias,
|
||||||
|
"m.room.create" => EventType::RoomCreate,
|
||||||
|
"m.room.guest_access" => EventType::RoomGuestAccess,
|
||||||
|
"m.room.history_visibility" => EventType::RoomHistoryVisibility,
|
||||||
|
"m.room.join_rules" => EventType::RoomJoinRules,
|
||||||
|
"m.room.member" => EventType::RoomMember,
|
||||||
|
"m.room.message" => EventType::RoomMessage,
|
||||||
|
"m.room.name" => EventType::RoomName,
|
||||||
|
"m.room.power_levels" => EventType::RoomPowerLevels,
|
||||||
|
"m.room.redaction" => EventType::RoomRedaction,
|
||||||
|
"m.room.third_party_invite" => EventType::RoomThirdPartyInvite,
|
||||||
|
"m.room.topic" => EventType::RoomTopic,
|
||||||
|
"m.tag" => EventType::Tag,
|
||||||
|
"m.typing" => EventType::Typing,
|
||||||
|
event_type => EventType::Custom(event_type.to_string()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Serialize for EventType {
|
impl Serialize for EventType {
|
||||||
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error> where S: Serializer {
|
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error> where S: Serializer {
|
||||||
serializer.serialize_str(&self.to_string())
|
serializer.serialize_str(&self.to_string())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Deserialize for EventType {
|
||||||
|
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error> where D: Deserializer {
|
||||||
|
struct EventTypeVisitor;
|
||||||
|
|
||||||
|
impl Visitor for EventTypeVisitor {
|
||||||
|
type Value = EventType;
|
||||||
|
|
||||||
|
fn visit_str<E>(&mut self, v: &str) -> Result<Self::Value, E>
|
||||||
|
where E: SerdeError {
|
||||||
|
Ok(EventType::from(v))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
deserializer.deserialize_str(EventTypeVisitor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use serde_json::to_string;
|
use serde_json::{from_str, to_string};
|
||||||
|
|
||||||
use super::EventType;
|
use super::EventType;
|
||||||
|
|
||||||
@ -210,4 +258,20 @@ mod tests {
|
|||||||
r#""io.ruma.test""#
|
r#""io.ruma.test""#
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn event_types_deserialize_from_display_form() {
|
||||||
|
assert_eq!(
|
||||||
|
from_str::<EventType>(r#""m.room.create""#).unwrap(),
|
||||||
|
EventType::RoomCreate
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn custom_event_types_deserialize_from_display_form() {
|
||||||
|
assert_eq!(
|
||||||
|
from_str::<EventType>(r#""io.ruma.test""#).unwrap(),
|
||||||
|
EventType::Custom("io.ruma.test".to_string())
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user