Add m.direct event
This commit is contained in:
parent
a9490dbee8
commit
0635fbae53
@ -6,6 +6,7 @@ use call::answer::AnswerEvent;
|
|||||||
use call::candidates::CandidatesEvent;
|
use call::candidates::CandidatesEvent;
|
||||||
use call::hangup::HangupEvent;
|
use call::hangup::HangupEvent;
|
||||||
use call::invite::InviteEvent;
|
use call::invite::InviteEvent;
|
||||||
|
use direct::DirectEvent;
|
||||||
use presence::PresenceEvent;
|
use presence::PresenceEvent;
|
||||||
use receipt::ReceiptEvent;
|
use receipt::ReceiptEvent;
|
||||||
use room::aliases::AliasesEvent;
|
use room::aliases::AliasesEvent;
|
||||||
@ -40,6 +41,8 @@ pub enum Event {
|
|||||||
CallHangup(HangupEvent),
|
CallHangup(HangupEvent),
|
||||||
/// m.call.invite
|
/// m.call.invite
|
||||||
CallInvite(InviteEvent),
|
CallInvite(InviteEvent),
|
||||||
|
/// m.direct
|
||||||
|
Direct(DirectEvent),
|
||||||
/// m.presence
|
/// m.presence
|
||||||
Presence(PresenceEvent),
|
Presence(PresenceEvent),
|
||||||
/// m.receipt
|
/// m.receipt
|
||||||
@ -167,6 +170,7 @@ impl Serialize for Event {
|
|||||||
Event::CallCandidates(ref event) => event.serialize(serializer),
|
Event::CallCandidates(ref event) => event.serialize(serializer),
|
||||||
Event::CallHangup(ref event) => event.serialize(serializer),
|
Event::CallHangup(ref event) => event.serialize(serializer),
|
||||||
Event::CallInvite(ref event) => event.serialize(serializer),
|
Event::CallInvite(ref event) => event.serialize(serializer),
|
||||||
|
Event::Direct(ref event) => event.serialize(serializer),
|
||||||
Event::Presence(ref event) => event.serialize(serializer),
|
Event::Presence(ref event) => event.serialize(serializer),
|
||||||
Event::Receipt(ref event) => event.serialize(serializer),
|
Event::Receipt(ref event) => event.serialize(serializer),
|
||||||
Event::RoomAliases(ref event) => event.serialize(serializer),
|
Event::RoomAliases(ref event) => event.serialize(serializer),
|
||||||
@ -239,6 +243,14 @@ impl<'de> Deserialize<'de> for Event {
|
|||||||
|
|
||||||
Ok(Event::CallInvite(event))
|
Ok(Event::CallInvite(event))
|
||||||
}
|
}
|
||||||
|
EventType::Direct => {
|
||||||
|
let event = match from_value::<DirectEvent>(value) {
|
||||||
|
Ok(event) => event,
|
||||||
|
Err(error) => return Err(D::Error::custom(error.to_string())),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(Event::Direct(event))
|
||||||
|
}
|
||||||
EventType::Presence => {
|
EventType::Presence => {
|
||||||
let event = match from_value::<PresenceEvent>(value) {
|
let event = match from_value::<PresenceEvent>(value) {
|
||||||
Ok(event) => event,
|
Ok(event) => event,
|
||||||
@ -615,7 +627,11 @@ impl<'de> Deserialize<'de> for RoomEvent {
|
|||||||
Ok(RoomEvent::CustomRoom(event))
|
Ok(RoomEvent::CustomRoom(event))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EventType::Presence | EventType::Receipt | EventType::Tag | EventType::Typing => {
|
EventType::Direct |
|
||||||
|
EventType::Presence |
|
||||||
|
EventType::Receipt |
|
||||||
|
EventType::Tag |
|
||||||
|
EventType::Typing => {
|
||||||
return Err(D::Error::custom("not a room event".to_string()));
|
return Err(D::Error::custom("not a room event".to_string()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -761,9 +777,16 @@ impl<'de> Deserialize<'de> for StateEvent {
|
|||||||
|
|
||||||
Ok(StateEvent::CustomState(event))
|
Ok(StateEvent::CustomState(event))
|
||||||
}
|
}
|
||||||
EventType::CallAnswer | EventType::CallCandidates | EventType::CallHangup |
|
EventType::CallAnswer |
|
||||||
EventType::CallInvite | EventType::Presence | EventType::Receipt |
|
EventType::CallCandidates |
|
||||||
EventType::RoomMessage | EventType::RoomRedaction | EventType::Tag |
|
EventType::CallHangup |
|
||||||
|
EventType::CallInvite |
|
||||||
|
EventType::Direct |
|
||||||
|
EventType::Presence |
|
||||||
|
EventType::Receipt |
|
||||||
|
EventType::RoomMessage |
|
||||||
|
EventType::RoomRedaction |
|
||||||
|
EventType::Tag |
|
||||||
EventType::Typing => {
|
EventType::Typing => {
|
||||||
return Err(D::Error::custom("not a state event".to_string()));
|
return Err(D::Error::custom("not a state event".to_string()));
|
||||||
}
|
}
|
||||||
@ -785,6 +808,7 @@ impl_from_t_for_event!(AnswerEvent, CallAnswer);
|
|||||||
impl_from_t_for_event!(CandidatesEvent, CallCandidates);
|
impl_from_t_for_event!(CandidatesEvent, CallCandidates);
|
||||||
impl_from_t_for_event!(HangupEvent, CallHangup);
|
impl_from_t_for_event!(HangupEvent, CallHangup);
|
||||||
impl_from_t_for_event!(InviteEvent, CallInvite);
|
impl_from_t_for_event!(InviteEvent, CallInvite);
|
||||||
|
impl_from_t_for_event!(DirectEvent, Direct);
|
||||||
impl_from_t_for_event!(PresenceEvent, Presence);
|
impl_from_t_for_event!(PresenceEvent, Presence);
|
||||||
impl_from_t_for_event!(ReceiptEvent, Receipt);
|
impl_from_t_for_event!(ReceiptEvent, Receipt);
|
||||||
impl_from_t_for_event!(AliasesEvent, RoomAliases);
|
impl_from_t_for_event!(AliasesEvent, RoomAliases);
|
||||||
|
@ -6,6 +6,7 @@ use call::answer::AnswerEvent;
|
|||||||
use call::candidates::CandidatesEvent;
|
use call::candidates::CandidatesEvent;
|
||||||
use call::hangup::HangupEvent;
|
use call::hangup::HangupEvent;
|
||||||
use call::invite::InviteEvent;
|
use call::invite::InviteEvent;
|
||||||
|
use direct::DirectEvent;
|
||||||
use presence::PresenceEvent;
|
use presence::PresenceEvent;
|
||||||
use receipt::ReceiptEvent;
|
use receipt::ReceiptEvent;
|
||||||
use room::message::MessageEvent;
|
use room::message::MessageEvent;
|
||||||
@ -22,6 +23,8 @@ pub use super::all::StateEvent;
|
|||||||
/// A basic event.
|
/// A basic event.
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub enum Event {
|
pub enum Event {
|
||||||
|
/// m.direct
|
||||||
|
Direct(DirectEvent),
|
||||||
/// m.presence
|
/// m.presence
|
||||||
Presence(PresenceEvent),
|
Presence(PresenceEvent),
|
||||||
/// m.receipt
|
/// m.receipt
|
||||||
@ -56,6 +59,7 @@ pub enum RoomEvent {
|
|||||||
impl Serialize for Event {
|
impl Serialize for Event {
|
||||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {
|
||||||
match *self {
|
match *self {
|
||||||
|
Event::Direct(ref event) => event.serialize(serializer),
|
||||||
Event::Presence(ref event) => event.serialize(serializer),
|
Event::Presence(ref event) => event.serialize(serializer),
|
||||||
Event::Receipt(ref event) => event.serialize(serializer),
|
Event::Receipt(ref event) => event.serialize(serializer),
|
||||||
Event::Tag(ref event) => event.serialize(serializer),
|
Event::Tag(ref event) => event.serialize(serializer),
|
||||||
@ -80,6 +84,14 @@ impl<'de> Deserialize<'de> for Event {
|
|||||||
};
|
};
|
||||||
|
|
||||||
match event_type {
|
match event_type {
|
||||||
|
EventType::Direct => {
|
||||||
|
let event = match from_value::<DirectEvent>(value) {
|
||||||
|
Ok(event) => event,
|
||||||
|
Err(error) => return Err(D::Error::custom(error.to_string())),
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(Event::Direct(event))
|
||||||
|
}
|
||||||
EventType::Presence => {
|
EventType::Presence => {
|
||||||
let event = match from_value::<PresenceEvent>(value) {
|
let event = match from_value::<PresenceEvent>(value) {
|
||||||
Ok(event) => event,
|
Ok(event) => event,
|
||||||
@ -217,12 +229,23 @@ impl<'de> Deserialize<'de> for RoomEvent {
|
|||||||
|
|
||||||
Ok(RoomEvent::CustomRoom(event))
|
Ok(RoomEvent::CustomRoom(event))
|
||||||
}
|
}
|
||||||
EventType::Presence | EventType::Receipt | EventType::RoomAliases |
|
EventType::Direct |
|
||||||
EventType::RoomAvatar | EventType::RoomCanonicalAlias | EventType::RoomCreate |
|
EventType::Presence |
|
||||||
EventType::RoomGuestAccess | EventType::RoomHistoryVisibility |
|
EventType::Receipt |
|
||||||
EventType::RoomJoinRules | EventType::RoomMember | EventType::RoomName |
|
EventType::RoomAliases |
|
||||||
EventType::RoomPowerLevels |EventType::RoomThirdPartyInvite | EventType::RoomTopic |
|
EventType::RoomAvatar |
|
||||||
EventType::Tag | EventType::Typing => {
|
EventType::RoomCanonicalAlias |
|
||||||
|
EventType::RoomCreate |
|
||||||
|
EventType::RoomGuestAccess |
|
||||||
|
EventType::RoomHistoryVisibility |
|
||||||
|
EventType::RoomJoinRules |
|
||||||
|
EventType::RoomMember |
|
||||||
|
EventType::RoomName |
|
||||||
|
EventType::RoomPowerLevels |
|
||||||
|
EventType::RoomThirdPartyInvite |
|
||||||
|
EventType::RoomTopic |
|
||||||
|
EventType::Tag |
|
||||||
|
EventType::Typing => {
|
||||||
return Err(D::Error::custom("not exclusively a room event".to_string()));
|
return Err(D::Error::custom("not exclusively a room event".to_string()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -238,6 +261,7 @@ macro_rules! impl_from_t_for_event {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl_from_t_for_event!(DirectEvent, Direct);
|
||||||
impl_from_t_for_event!(PresenceEvent, Presence);
|
impl_from_t_for_event!(PresenceEvent, Presence);
|
||||||
impl_from_t_for_event!(ReceiptEvent, Receipt);
|
impl_from_t_for_event!(ReceiptEvent, Receipt);
|
||||||
impl_from_t_for_event!(TagEvent, Tag);
|
impl_from_t_for_event!(TagEvent, Tag);
|
||||||
|
93
src/direct.rs
Normal file
93
src/direct.rs
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
//! Types for the *m.direct* event.
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use ruma_identifiers::{UserId, RoomId};
|
||||||
|
|
||||||
|
event! {
|
||||||
|
/// Informs the client about the rooms that are considered direct by a user.
|
||||||
|
pub struct DirectEvent(DirectEventContent) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The payload of a `DirectEvent`.
|
||||||
|
///
|
||||||
|
/// A mapping of `UserId`'s to a collection of `RoomId`'s which are considered
|
||||||
|
/// *direct* for that particular user.
|
||||||
|
pub type DirectEventContent = HashMap<UserId, Vec<RoomId>>;
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use ruma_identifiers::{UserId, RoomId};
|
||||||
|
use serde_json::{from_str, to_string};
|
||||||
|
|
||||||
|
use collections;
|
||||||
|
use direct::{DirectEvent, DirectEventContent};
|
||||||
|
use super::super::EventType;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn serialization() {
|
||||||
|
let mut content: DirectEventContent = HashMap::new();
|
||||||
|
let alice = UserId::new("ruma.io").unwrap();
|
||||||
|
let room = vec![RoomId::new("ruma.io").unwrap()];
|
||||||
|
|
||||||
|
content.insert(alice.clone(), room.clone());
|
||||||
|
|
||||||
|
let event = DirectEvent {
|
||||||
|
content: content,
|
||||||
|
event_type: EventType::Direct,
|
||||||
|
};
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
to_string(&event).unwrap(),
|
||||||
|
format!(
|
||||||
|
r#"{{"content":{{"{}":["{}"]}},"type":"m.direct"}}"#,
|
||||||
|
alice.to_string(), room[0].to_string()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn deserialization() {
|
||||||
|
let alice = UserId::new("ruma.io").unwrap();
|
||||||
|
let rooms = vec![
|
||||||
|
RoomId::new("ruma.io").unwrap(),
|
||||||
|
RoomId::new("ruma.io").unwrap()
|
||||||
|
];
|
||||||
|
|
||||||
|
let json_data = format!(r#"{{
|
||||||
|
"content": {{ "{}": ["{}", "{}"] }},
|
||||||
|
"type": "m.direct"
|
||||||
|
}}"#, alice.to_string(), rooms[0].to_string(), rooms[1].to_string());
|
||||||
|
|
||||||
|
let event = from_str::<DirectEvent>(&json_data).unwrap();
|
||||||
|
assert_eq!(event.event_type, EventType::Direct);
|
||||||
|
|
||||||
|
let direct_rooms = event.content.get(&alice).unwrap();
|
||||||
|
assert!(direct_rooms.contains(&rooms[0]));
|
||||||
|
assert!(direct_rooms.contains(&rooms[1]));
|
||||||
|
|
||||||
|
match from_str::<collections::all::Event>(&json_data).unwrap() {
|
||||||
|
collections::all::Event::Direct(event) => {
|
||||||
|
assert_eq!(event.event_type, EventType::Direct);
|
||||||
|
|
||||||
|
let direct_rooms = event.content.get(&alice).unwrap();
|
||||||
|
assert!(direct_rooms.contains(&rooms[0]));
|
||||||
|
assert!(direct_rooms.contains(&rooms[1]));
|
||||||
|
},
|
||||||
|
_ => assert!(false)
|
||||||
|
};
|
||||||
|
|
||||||
|
match from_str::<collections::only::Event>(&json_data).unwrap() {
|
||||||
|
collections::only::Event::Direct(event) => {
|
||||||
|
assert_eq!(event.event_type, EventType::Direct);
|
||||||
|
|
||||||
|
let direct_rooms = event.content.get(&alice).unwrap();
|
||||||
|
assert!(direct_rooms.contains(&rooms[0]));
|
||||||
|
assert!(direct_rooms.contains(&rooms[1]));
|
||||||
|
},
|
||||||
|
_ => assert!(false)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
@ -120,6 +120,7 @@ pub mod collections {
|
|||||||
pub mod all;
|
pub mod all;
|
||||||
pub mod only;
|
pub mod only;
|
||||||
}
|
}
|
||||||
|
pub mod direct;
|
||||||
pub mod presence;
|
pub mod presence;
|
||||||
pub mod receipt;
|
pub mod receipt;
|
||||||
pub mod room;
|
pub mod room;
|
||||||
@ -142,6 +143,8 @@ pub enum EventType {
|
|||||||
CallHangup,
|
CallHangup,
|
||||||
/// m.call.invite
|
/// m.call.invite
|
||||||
CallInvite,
|
CallInvite,
|
||||||
|
/// m.direct
|
||||||
|
Direct,
|
||||||
/// m.presence
|
/// m.presence
|
||||||
Presence,
|
Presence,
|
||||||
/// m.receipt
|
/// m.receipt
|
||||||
@ -243,6 +246,7 @@ impl Display for EventType {
|
|||||||
EventType::CallCandidates => "m.call.candidates",
|
EventType::CallCandidates => "m.call.candidates",
|
||||||
EventType::CallHangup => "m.call.hangup",
|
EventType::CallHangup => "m.call.hangup",
|
||||||
EventType::CallInvite => "m.call.invite",
|
EventType::CallInvite => "m.call.invite",
|
||||||
|
EventType::Direct => "m.direct",
|
||||||
EventType::Presence => "m.presence",
|
EventType::Presence => "m.presence",
|
||||||
EventType::Receipt => "m.receipt",
|
EventType::Receipt => "m.receipt",
|
||||||
EventType::RoomAliases => "m.room.aliases",
|
EventType::RoomAliases => "m.room.aliases",
|
||||||
@ -275,6 +279,7 @@ impl<'a> From<&'a str> for EventType {
|
|||||||
"m.call.candidates" => EventType::CallCandidates,
|
"m.call.candidates" => EventType::CallCandidates,
|
||||||
"m.call.hangup" => EventType::CallHangup,
|
"m.call.hangup" => EventType::CallHangup,
|
||||||
"m.call.invite" => EventType::CallInvite,
|
"m.call.invite" => EventType::CallInvite,
|
||||||
|
"m.direct" => EventType::Direct,
|
||||||
"m.presence" => EventType::Presence,
|
"m.presence" => EventType::Presence,
|
||||||
"m.receipt" => EventType::Receipt,
|
"m.receipt" => EventType::Receipt,
|
||||||
"m.room.aliases" => EventType::RoomAliases,
|
"m.room.aliases" => EventType::RoomAliases,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user