Merge pull request #9 from mujx/matrix-events-update
Update matrix events to their latest version
This commit is contained in:
		
						commit
						601f00e820
					
				| @ -10,7 +10,7 @@ room_event! { | |||||||
| /// The payload of an `AnswerEvent`.
 | /// The payload of an `AnswerEvent`.
 | ||||||
| #[derive(Clone, Debug, Deserialize, Serialize)] | #[derive(Clone, Debug, Deserialize, Serialize)] | ||||||
| pub struct AnswerEventContent { | pub struct AnswerEventContent { | ||||||
|     /// The VoIP session description.
 |     /// The VoIP session description object. The session description type must be *answer*.
 | ||||||
|     pub answer: SessionDescription, |     pub answer: SessionDescription, | ||||||
|     /// The ID of the call this event relates to.
 |     /// The ID of the call this event relates to.
 | ||||||
|     pub call_id: String, |     pub call_id: String, | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ pub struct InviteEventContent { | |||||||
|     /// value, clients should discard it. They should also no longer show the call as awaiting an
 |     /// value, clients should discard it. They should also no longer show the call as awaiting an
 | ||||||
|     /// answer in the UI.
 |     /// answer in the UI.
 | ||||||
|     pub lifetime: u64, |     pub lifetime: u64, | ||||||
|     /// The session description object.
 |     /// The session description object. The session description type must be *offer*.
 | ||||||
|     pub offer: SessionDescription, |     pub offer: SessionDescription, | ||||||
|     /// The version of the VoIP specification this messages adheres to.
 |     /// The version of the VoIP specification this messages adheres to.
 | ||||||
|     pub version: u64, |     pub version: u64, | ||||||
|  | |||||||
| @ -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; | ||||||
| @ -18,6 +19,7 @@ use room::join_rules::JoinRulesEvent; | |||||||
| use room::member::MemberEvent; | use room::member::MemberEvent; | ||||||
| use room::message::MessageEvent; | use room::message::MessageEvent; | ||||||
| use room::name::NameEvent; | use room::name::NameEvent; | ||||||
|  | use room::pinned_events::PinnedEventsEvent; | ||||||
| use room::power_levels::PowerLevelsEvent; | use room::power_levels::PowerLevelsEvent; | ||||||
| use room::redaction::RedactionEvent; | use room::redaction::RedactionEvent; | ||||||
| use room::third_party_invite::ThirdPartyInviteEvent; | use room::third_party_invite::ThirdPartyInviteEvent; | ||||||
| @ -40,6 +42,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
 | ||||||
| @ -64,6 +68,8 @@ pub enum Event { | |||||||
|     RoomMessage(MessageEvent), |     RoomMessage(MessageEvent), | ||||||
|     /// m.room.name
 |     /// m.room.name
 | ||||||
|     RoomName(NameEvent), |     RoomName(NameEvent), | ||||||
|  |     /// m.room.pinned_events
 | ||||||
|  |     RoomPinnedEvents(PinnedEventsEvent), | ||||||
|     /// m.room.power_levels
 |     /// m.room.power_levels
 | ||||||
|     RoomPowerLevels(PowerLevelsEvent), |     RoomPowerLevels(PowerLevelsEvent), | ||||||
|     /// m.room.redaction
 |     /// m.room.redaction
 | ||||||
| @ -115,6 +121,8 @@ pub enum RoomEvent { | |||||||
|     RoomMessage(MessageEvent), |     RoomMessage(MessageEvent), | ||||||
|     /// m.room.name
 |     /// m.room.name
 | ||||||
|     RoomName(NameEvent), |     RoomName(NameEvent), | ||||||
|  |     /// m.room.pinned_events
 | ||||||
|  |     RoomPinnedEvents(PinnedEventsEvent), | ||||||
|     /// m.room.power_levels
 |     /// m.room.power_levels
 | ||||||
|     RoomPowerLevels(PowerLevelsEvent), |     RoomPowerLevels(PowerLevelsEvent), | ||||||
|     /// m.room.redaction
 |     /// m.room.redaction
 | ||||||
| @ -150,6 +158,8 @@ pub enum StateEvent { | |||||||
|     RoomMember(MemberEvent), |     RoomMember(MemberEvent), | ||||||
|     /// m.room.name
 |     /// m.room.name
 | ||||||
|     RoomName(NameEvent), |     RoomName(NameEvent), | ||||||
|  |     /// m.room.pinned_events
 | ||||||
|  |     RoomPinnedEvents(PinnedEventsEvent), | ||||||
|     /// m.room.power_levels
 |     /// m.room.power_levels
 | ||||||
|     RoomPowerLevels(PowerLevelsEvent), |     RoomPowerLevels(PowerLevelsEvent), | ||||||
|     /// m.room.third_party_invite
 |     /// m.room.third_party_invite
 | ||||||
| @ -167,6 +177,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), | ||||||
| @ -179,6 +190,7 @@ impl Serialize for Event { | |||||||
|             Event::RoomMember(ref event) => event.serialize(serializer), |             Event::RoomMember(ref event) => event.serialize(serializer), | ||||||
|             Event::RoomMessage(ref event) => event.serialize(serializer), |             Event::RoomMessage(ref event) => event.serialize(serializer), | ||||||
|             Event::RoomName(ref event) => event.serialize(serializer), |             Event::RoomName(ref event) => event.serialize(serializer), | ||||||
|  |             Event::RoomPinnedEvents(ref event) => event.serialize(serializer), | ||||||
|             Event::RoomPowerLevels(ref event) => event.serialize(serializer), |             Event::RoomPowerLevels(ref event) => event.serialize(serializer), | ||||||
|             Event::RoomRedaction(ref event) => event.serialize(serializer), |             Event::RoomRedaction(ref event) => event.serialize(serializer), | ||||||
|             Event::RoomThirdPartyInvite(ref event) => event.serialize(serializer), |             Event::RoomThirdPartyInvite(ref event) => event.serialize(serializer), | ||||||
| @ -239,6 +251,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, | ||||||
| @ -335,6 +355,14 @@ impl<'de> Deserialize<'de> for Event { | |||||||
| 
 | 
 | ||||||
|                 Ok(Event::RoomName(event)) |                 Ok(Event::RoomName(event)) | ||||||
|             } |             } | ||||||
|  |             EventType::RoomPinnedEvents => { | ||||||
|  |                 let event = match from_value::<PinnedEventsEvent>(value) { | ||||||
|  |                     Ok(event) => event, | ||||||
|  |                     Err(error) => return Err(D::Error::custom(error.to_string())), | ||||||
|  |                 }; | ||||||
|  | 
 | ||||||
|  |                 Ok(Event::RoomPinnedEvents(event)) | ||||||
|  |             } | ||||||
|             EventType::RoomPowerLevels => { |             EventType::RoomPowerLevels => { | ||||||
|                 let event = match from_value::<PowerLevelsEvent>(value) { |                 let event = match from_value::<PowerLevelsEvent>(value) { | ||||||
|                     Ok(event) => event, |                     Ok(event) => event, | ||||||
| @ -429,6 +457,7 @@ impl Serialize for RoomEvent { | |||||||
|             RoomEvent::RoomMember(ref event) => event.serialize(serializer), |             RoomEvent::RoomMember(ref event) => event.serialize(serializer), | ||||||
|             RoomEvent::RoomMessage(ref event) => event.serialize(serializer), |             RoomEvent::RoomMessage(ref event) => event.serialize(serializer), | ||||||
|             RoomEvent::RoomName(ref event) => event.serialize(serializer), |             RoomEvent::RoomName(ref event) => event.serialize(serializer), | ||||||
|  |             RoomEvent::RoomPinnedEvents(ref event) => event.serialize(serializer), | ||||||
|             RoomEvent::RoomPowerLevels(ref event) => event.serialize(serializer), |             RoomEvent::RoomPowerLevels(ref event) => event.serialize(serializer), | ||||||
|             RoomEvent::RoomRedaction(ref event) => event.serialize(serializer), |             RoomEvent::RoomRedaction(ref event) => event.serialize(serializer), | ||||||
|             RoomEvent::RoomThirdPartyInvite(ref event) => event.serialize(serializer), |             RoomEvent::RoomThirdPartyInvite(ref event) => event.serialize(serializer), | ||||||
| @ -566,6 +595,14 @@ impl<'de> Deserialize<'de> for RoomEvent { | |||||||
| 
 | 
 | ||||||
|                 Ok(RoomEvent::RoomName(event)) |                 Ok(RoomEvent::RoomName(event)) | ||||||
|             } |             } | ||||||
|  |             EventType::RoomPinnedEvents => { | ||||||
|  |                 let event = match from_value::<PinnedEventsEvent>(value) { | ||||||
|  |                     Ok(event) => event, | ||||||
|  |                     Err(error) => return Err(D::Error::custom(error.to_string())), | ||||||
|  |                 }; | ||||||
|  | 
 | ||||||
|  |                 Ok(RoomEvent::RoomPinnedEvents(event)) | ||||||
|  |             } | ||||||
|             EventType::RoomPowerLevels => { |             EventType::RoomPowerLevels => { | ||||||
|                 let event = match from_value::<PowerLevelsEvent>(value) { |                 let event = match from_value::<PowerLevelsEvent>(value) { | ||||||
|                     Ok(event) => event, |                     Ok(event) => event, | ||||||
| @ -615,7 +652,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())); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @ -634,6 +675,7 @@ impl Serialize for StateEvent { | |||||||
|             StateEvent::RoomJoinRules(ref event) => event.serialize(serializer), |             StateEvent::RoomJoinRules(ref event) => event.serialize(serializer), | ||||||
|             StateEvent::RoomMember(ref event) => event.serialize(serializer), |             StateEvent::RoomMember(ref event) => event.serialize(serializer), | ||||||
|             StateEvent::RoomName(ref event) => event.serialize(serializer), |             StateEvent::RoomName(ref event) => event.serialize(serializer), | ||||||
|  |             StateEvent::RoomPinnedEvents(ref event) => event.serialize(serializer), | ||||||
|             StateEvent::RoomPowerLevels(ref event) => event.serialize(serializer), |             StateEvent::RoomPowerLevels(ref event) => event.serialize(serializer), | ||||||
|             StateEvent::RoomThirdPartyInvite(ref event) => event.serialize(serializer), |             StateEvent::RoomThirdPartyInvite(ref event) => event.serialize(serializer), | ||||||
|             StateEvent::RoomTopic(ref event) => event.serialize(serializer), |             StateEvent::RoomTopic(ref event) => event.serialize(serializer), | ||||||
| @ -729,6 +771,14 @@ impl<'de> Deserialize<'de> for StateEvent { | |||||||
| 
 | 
 | ||||||
|                 Ok(StateEvent::RoomName(event)) |                 Ok(StateEvent::RoomName(event)) | ||||||
|             } |             } | ||||||
|  |             EventType::RoomPinnedEvents => { | ||||||
|  |                 let event = match from_value::<PinnedEventsEvent>(value) { | ||||||
|  |                     Ok(event) => event, | ||||||
|  |                     Err(error) => return Err(D::Error::custom(error.to_string())), | ||||||
|  |                 }; | ||||||
|  | 
 | ||||||
|  |                 Ok(StateEvent::RoomPinnedEvents(event)) | ||||||
|  |             } | ||||||
|             EventType::RoomPowerLevels => { |             EventType::RoomPowerLevels => { | ||||||
|                 let event = match from_value::<PowerLevelsEvent>(value) { |                 let event = match from_value::<PowerLevelsEvent>(value) { | ||||||
|                     Ok(event) => event, |                     Ok(event) => event, | ||||||
| @ -761,9 +811,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 +842,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); | ||||||
| @ -797,6 +855,7 @@ impl_from_t_for_event!(JoinRulesEvent, RoomJoinRules); | |||||||
| impl_from_t_for_event!(MemberEvent, RoomMember); | impl_from_t_for_event!(MemberEvent, RoomMember); | ||||||
| impl_from_t_for_event!(MessageEvent, RoomMessage); | impl_from_t_for_event!(MessageEvent, RoomMessage); | ||||||
| impl_from_t_for_event!(NameEvent, RoomName); | impl_from_t_for_event!(NameEvent, RoomName); | ||||||
|  | impl_from_t_for_event!(PinnedEventsEvent, RoomPinnedEvents); | ||||||
| impl_from_t_for_event!(PowerLevelsEvent, RoomPowerLevels); | impl_from_t_for_event!(PowerLevelsEvent, RoomPowerLevels); | ||||||
| impl_from_t_for_event!(RedactionEvent, RoomRedaction); | impl_from_t_for_event!(RedactionEvent, RoomRedaction); | ||||||
| impl_from_t_for_event!(ThirdPartyInviteEvent, RoomThirdPartyInvite); | impl_from_t_for_event!(ThirdPartyInviteEvent, RoomThirdPartyInvite); | ||||||
| @ -831,6 +890,7 @@ impl_from_t_for_room_event!(JoinRulesEvent, RoomJoinRules); | |||||||
| impl_from_t_for_room_event!(MemberEvent, RoomMember); | impl_from_t_for_room_event!(MemberEvent, RoomMember); | ||||||
| impl_from_t_for_room_event!(MessageEvent, RoomMessage); | impl_from_t_for_room_event!(MessageEvent, RoomMessage); | ||||||
| impl_from_t_for_room_event!(NameEvent, RoomName); | impl_from_t_for_room_event!(NameEvent, RoomName); | ||||||
|  | impl_from_t_for_room_event!(PinnedEventsEvent, RoomPinnedEvents); | ||||||
| impl_from_t_for_room_event!(PowerLevelsEvent, RoomPowerLevels); | impl_from_t_for_room_event!(PowerLevelsEvent, RoomPowerLevels); | ||||||
| impl_from_t_for_room_event!(RedactionEvent, RoomRedaction); | impl_from_t_for_room_event!(RedactionEvent, RoomRedaction); | ||||||
| impl_from_t_for_room_event!(ThirdPartyInviteEvent, RoomThirdPartyInvite); | impl_from_t_for_room_event!(ThirdPartyInviteEvent, RoomThirdPartyInvite); | ||||||
| @ -857,6 +917,7 @@ impl_from_t_for_state_event!(HistoryVisibilityEvent, RoomHistoryVisibility); | |||||||
| impl_from_t_for_state_event!(JoinRulesEvent, RoomJoinRules); | impl_from_t_for_state_event!(JoinRulesEvent, RoomJoinRules); | ||||||
| impl_from_t_for_state_event!(MemberEvent, RoomMember); | impl_from_t_for_state_event!(MemberEvent, RoomMember); | ||||||
| impl_from_t_for_state_event!(NameEvent, RoomName); | impl_from_t_for_state_event!(NameEvent, RoomName); | ||||||
|  | impl_from_t_for_state_event!(PinnedEventsEvent, RoomPinnedEvents); | ||||||
| impl_from_t_for_state_event!(PowerLevelsEvent, RoomPowerLevels); | impl_from_t_for_state_event!(PowerLevelsEvent, RoomPowerLevels); | ||||||
| impl_from_t_for_state_event!(ThirdPartyInviteEvent, RoomThirdPartyInvite); | impl_from_t_for_state_event!(ThirdPartyInviteEvent, RoomThirdPartyInvite); | ||||||
| impl_from_t_for_state_event!(TopicEvent, RoomTopic); | impl_from_t_for_state_event!(TopicEvent, RoomTopic); | ||||||
|  | |||||||
| @ -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, | ||||||
| @ -124,8 +136,9 @@ impl<'de> Deserialize<'de> for Event { | |||||||
|             EventType::CallInvite | EventType::RoomAliases | EventType::RoomAvatar | |             EventType::CallInvite | EventType::RoomAliases | EventType::RoomAvatar | | ||||||
|             EventType::RoomCanonicalAlias | EventType::RoomCreate | EventType::RoomGuestAccess | |             EventType::RoomCanonicalAlias | EventType::RoomCreate | EventType::RoomGuestAccess | | ||||||
|             EventType::RoomHistoryVisibility | EventType::RoomJoinRules | EventType::RoomMember | |             EventType::RoomHistoryVisibility | EventType::RoomJoinRules | EventType::RoomMember | | ||||||
|             EventType::RoomMessage | EventType::RoomName | EventType::RoomPowerLevels | |             EventType::RoomMessage | EventType::RoomName | EventType::RoomPinnedEvents | | ||||||
|             EventType::RoomRedaction | EventType::RoomThirdPartyInvite | EventType::RoomTopic => { |             EventType::RoomPowerLevels | EventType::RoomRedaction | EventType::RoomThirdPartyInvite | | ||||||
|  |             EventType::RoomTopic => { | ||||||
|                 return Err(D::Error::custom("not exclusively a basic event".to_string())); |                 return Err(D::Error::custom("not exclusively a basic event".to_string())); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @ -217,12 +230,24 @@ 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::RoomPinnedEvents | | ||||||
|  |             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 +263,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) | ||||||
|  |         }; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										24
									
								
								src/lib.rs
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								src/lib.rs
									
									
									
									
									
								
							| @ -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
 | ||||||
| @ -166,6 +169,8 @@ pub enum EventType { | |||||||
|     RoomMessage, |     RoomMessage, | ||||||
|     /// m.room.name
 |     /// m.room.name
 | ||||||
|     RoomName, |     RoomName, | ||||||
|  |     /// m.room.pinned_events
 | ||||||
|  |     RoomPinnedEvents, | ||||||
|     /// m.room.power_levels
 |     /// m.room.power_levels
 | ||||||
|     RoomPowerLevels, |     RoomPowerLevels, | ||||||
|     /// m.room.redaction
 |     /// m.room.redaction
 | ||||||
| @ -192,12 +197,6 @@ pub trait Event where Self: Debug + for<'a> Deserialize<'a> + Serialize { | |||||||
| 
 | 
 | ||||||
|     /// The type of the event.
 |     /// The type of the event.
 | ||||||
|     fn event_type(&self) -> &EventType; |     fn event_type(&self) -> &EventType; | ||||||
| 
 |  | ||||||
|     /// Extra top-level key-value pairs specific to this event type, but that are not under the
 |  | ||||||
|     /// `content` field.
 |  | ||||||
|     fn extra_content(&self) -> Option<Value> { |  | ||||||
|         None |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// An event within the context of a room.
 | /// An event within the context of a room.
 | ||||||
| @ -205,14 +204,17 @@ pub trait RoomEvent: Event { | |||||||
|     /// The unique identifier for the event.
 |     /// The unique identifier for the event.
 | ||||||
|     fn event_id(&self) -> &EventId; |     fn event_id(&self) -> &EventId; | ||||||
| 
 | 
 | ||||||
|  |     /// Timestamp in milliseconds on originating homeserver when this event was sent.
 | ||||||
|  |     fn origin_server_ts(&self) -> u64; | ||||||
|  | 
 | ||||||
|     /// The unique identifier for the room associated with this event.
 |     /// The unique identifier for the room associated with this event.
 | ||||||
|     fn room_id(&self) -> &RoomId; |     fn room_id(&self) -> &RoomId; | ||||||
| 
 | 
 | ||||||
|  |     /// The unique identifier for the user who sent this event.
 | ||||||
|  |     fn sender(&self) -> &UserId; | ||||||
|  | 
 | ||||||
|     /// Additional key-value pairs not signed by the homeserver.
 |     /// Additional key-value pairs not signed by the homeserver.
 | ||||||
|     fn unsigned(&self) -> Option<&Value>; |     fn unsigned(&self) -> Option<&Value>; | ||||||
| 
 |  | ||||||
|     /// The unique identifier for the user associated with this event.
 |  | ||||||
|     fn user_id(&self) -> &UserId; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// An event that describes persistent state about a room.
 | /// An event that describes persistent state about a room.
 | ||||||
| @ -246,6 +248,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", | ||||||
| @ -258,6 +261,7 @@ impl Display for EventType { | |||||||
|             EventType::RoomMember => "m.room.member", |             EventType::RoomMember => "m.room.member", | ||||||
|             EventType::RoomMessage => "m.room.message", |             EventType::RoomMessage => "m.room.message", | ||||||
|             EventType::RoomName => "m.room.name", |             EventType::RoomName => "m.room.name", | ||||||
|  |             EventType::RoomPinnedEvents=> "m.room.pinned_events", | ||||||
|             EventType::RoomPowerLevels => "m.room.power_levels", |             EventType::RoomPowerLevels => "m.room.power_levels", | ||||||
|             EventType::RoomRedaction => "m.room.redaction", |             EventType::RoomRedaction => "m.room.redaction", | ||||||
|             EventType::RoomThirdPartyInvite => "m.room.third_party_invite", |             EventType::RoomThirdPartyInvite => "m.room.third_party_invite", | ||||||
| @ -278,6 +282,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, | ||||||
| @ -290,6 +295,7 @@ impl<'a> From<&'a str> for EventType { | |||||||
|             "m.room.member" => EventType::RoomMember, |             "m.room.member" => EventType::RoomMember, | ||||||
|             "m.room.message" => EventType::RoomMessage, |             "m.room.message" => EventType::RoomMessage, | ||||||
|             "m.room.name" => EventType::RoomName, |             "m.room.name" => EventType::RoomName, | ||||||
|  |             "m.room.pinned_events" => EventType::RoomPinnedEvents, | ||||||
|             "m.room.power_levels" => EventType::RoomPowerLevels, |             "m.room.power_levels" => EventType::RoomPowerLevels, | ||||||
|             "m.room.redaction" => EventType::RoomRedaction, |             "m.room.redaction" => EventType::RoomRedaction, | ||||||
|             "m.room.third_party_invite" => EventType::RoomThirdPartyInvite, |             "m.room.third_party_invite" => EventType::RoomThirdPartyInvite, | ||||||
|  | |||||||
| @ -90,6 +90,9 @@ macro_rules! room_event { | |||||||
|             #[serde(rename="type")] |             #[serde(rename="type")] | ||||||
|             pub event_type: $crate::EventType, |             pub event_type: $crate::EventType, | ||||||
| 
 | 
 | ||||||
|  |             /// Timestamp in milliseconds on originating homeserver when this event was sent.
 | ||||||
|  |             pub origin_server_ts: u64, | ||||||
|  | 
 | ||||||
|             /// The unique identifier for the room associated with this event.
 |             /// The unique identifier for the room associated with this event.
 | ||||||
|             pub room_id: ::ruma_identifiers::RoomId, |             pub room_id: ::ruma_identifiers::RoomId, | ||||||
| 
 | 
 | ||||||
| @ -97,9 +100,8 @@ macro_rules! room_event { | |||||||
|             #[serde(skip_serializing_if="Option::is_none")] |             #[serde(skip_serializing_if="Option::is_none")] | ||||||
|             pub unsigned: Option<::serde_json::Value>, |             pub unsigned: Option<::serde_json::Value>, | ||||||
| 
 | 
 | ||||||
|             /// The unique identifier for the user associated with this event.
 |             /// The unique identifier for the user who sent this event.
 | ||||||
|             #[serde(rename="sender")] |             pub sender: ::ruma_identifiers::UserId, | ||||||
|             pub user_id: ::ruma_identifiers::UserId, |  | ||||||
| 
 | 
 | ||||||
|             $( |             $( | ||||||
|                 $(#[$field_attr])* |                 $(#[$field_attr])* | ||||||
| @ -120,6 +122,10 @@ macro_rules! impl_room_event { | |||||||
|                 &self.event_id |                 &self.event_id | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|  |             fn origin_server_ts(&self) -> u64 { | ||||||
|  |                 self.origin_server_ts | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|             fn room_id(&self) -> &::ruma_identifiers::RoomId { |             fn room_id(&self) -> &::ruma_identifiers::RoomId { | ||||||
|                 &self.room_id |                 &self.room_id | ||||||
|             } |             } | ||||||
| @ -128,8 +134,8 @@ macro_rules! impl_room_event { | |||||||
|                 self.unsigned.as_ref() |                 self.unsigned.as_ref() | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             fn user_id(&self) -> &::ruma_identifiers::UserId { |             fn sender(&self) -> &::ruma_identifiers::UserId { | ||||||
|                 &self.user_id |                 &self.sender | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @ -158,6 +164,9 @@ macro_rules! state_event { | |||||||
|             #[serde(rename="type")] |             #[serde(rename="type")] | ||||||
|             pub event_type: $crate::EventType, |             pub event_type: $crate::EventType, | ||||||
| 
 | 
 | ||||||
|  |             /// Timestamp in milliseconds on originating homeserver when this event was sent.
 | ||||||
|  |             pub origin_server_ts: u64, | ||||||
|  | 
 | ||||||
|             /// The previous content for this state key, if any.
 |             /// The previous content for this state key, if any.
 | ||||||
|             #[serde(skip_serializing_if="Option::is_none")] |             #[serde(skip_serializing_if="Option::is_none")] | ||||||
|             pub prev_content: Option<$content_type>, |             pub prev_content: Option<$content_type>, | ||||||
| @ -173,8 +182,7 @@ macro_rules! state_event { | |||||||
|             pub unsigned: Option<::serde_json::Value>, |             pub unsigned: Option<::serde_json::Value>, | ||||||
| 
 | 
 | ||||||
|             /// The unique identifier for the user associated with this event.
 |             /// The unique identifier for the user associated with this event.
 | ||||||
|             #[serde(rename="sender")] |             pub sender: ::ruma_identifiers::UserId, | ||||||
|             pub user_id: ::ruma_identifiers::UserId, |  | ||||||
| 
 | 
 | ||||||
|             $( |             $( | ||||||
|                 $(#[$field_attr])* |                 $(#[$field_attr])* | ||||||
|  | |||||||
| @ -25,7 +25,7 @@ pub struct PresenceEventContent { | |||||||
|     #[serde(skip_serializing_if="Option::is_none")] |     #[serde(skip_serializing_if="Option::is_none")] | ||||||
|     pub displayname: Option<String>, |     pub displayname: Option<String>, | ||||||
| 
 | 
 | ||||||
|     /// The last time since this used performed some action, in milliseconds.
 |     /// The last time since this user performed some action, in milliseconds.
 | ||||||
|     #[serde(skip_serializing_if="Option::is_none")] |     #[serde(skip_serializing_if="Option::is_none")] | ||||||
|     pub last_active_ago: Option<u64>, |     pub last_active_ago: Option<u64>, | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -14,5 +14,6 @@ pub struct CreateEventContent { | |||||||
|     /// The `user_id` of the room creator. This is set by the homeserver.
 |     /// The `user_id` of the room creator. This is set by the homeserver.
 | ||||||
|     pub creator: UserId, |     pub creator: UserId, | ||||||
|     /// Whether or not this room's data should be transferred to other homeservers.
 |     /// Whether or not this room's data should be transferred to other homeservers.
 | ||||||
|  |     #[serde(rename="m.federate")] | ||||||
|     pub federate: Option<bool>, |     pub federate: Option<bool>, | ||||||
| } | } | ||||||
|  | |||||||
| @ -38,6 +38,11 @@ pub struct MemberEventContent { | |||||||
|     #[serde(skip_serializing_if="Option::is_none")] |     #[serde(skip_serializing_if="Option::is_none")] | ||||||
|     pub displayname: Option<String>, |     pub displayname: Option<String>, | ||||||
| 
 | 
 | ||||||
|  |     /// Flag indicating if the room containing this event was created
 | ||||||
|  |     /// with the intention of being a direct chat.
 | ||||||
|  |     #[serde(skip_serializing_if="Option::is_none")] | ||||||
|  |     pub is_direct: Option<bool>, | ||||||
|  | 
 | ||||||
|     /// The membership state of this user.
 |     /// The membership state of this user.
 | ||||||
|     pub membership: MembershipState, |     pub membership: MembershipState, | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -4,7 +4,7 @@ use serde::{Deserialize, Deserializer, Serialize, Serializer}; | |||||||
| use serde::de::Error; | use serde::de::Error; | ||||||
| use serde_json::{Value, from_value}; | use serde_json::{Value, from_value}; | ||||||
| 
 | 
 | ||||||
| use super::ImageInfo; | use super::{ImageInfo, ThumbnailInfo}; | ||||||
| 
 | 
 | ||||||
| room_event! { | room_event! { | ||||||
|     /// A message sent to a room.
 |     /// A message sent to a room.
 | ||||||
| @ -118,17 +118,13 @@ pub struct FileMessageEventContent { | |||||||
|     /// A human-readable description of the file. This is recommended to be the filename of the
 |     /// A human-readable description of the file. This is recommended to be the filename of the
 | ||||||
|     /// original upload.
 |     /// original upload.
 | ||||||
|     pub body: String, |     pub body: String, | ||||||
|  |     /// The original filename of the uploaded file.
 | ||||||
|  |     pub filename: String, | ||||||
|     /// Metadata about the file referred to in `url`.
 |     /// Metadata about the file referred to in `url`.
 | ||||||
|     #[serde(skip_serializing_if="Option::is_none")] |     #[serde(skip_serializing_if="Option::is_none")] | ||||||
|     pub info: Option<FileInfo>, |     pub info: Option<FileInfo>, | ||||||
|     /// The message type. Always *m.file*.
 |     /// The message type. Always *m.file*.
 | ||||||
|     pub msgtype: MessageType, |     pub msgtype: MessageType, | ||||||
|     /// Metadata about the image referred to in `thumbnail_url`.
 |  | ||||||
|     #[serde(skip_serializing_if="Option::is_none")] |  | ||||||
|     pub thumbnail_info: Option<ImageInfo>, |  | ||||||
|     /// The URL to the thumbnail of the file.
 |  | ||||||
|     #[serde(skip_serializing_if="Option::is_none")] |  | ||||||
|     pub thumbnail_url: Option<String>, |  | ||||||
|     /// The URL to the file.
 |     /// The URL to the file.
 | ||||||
|     pub url: String, |     pub url: String, | ||||||
| } | } | ||||||
| @ -140,6 +136,12 @@ pub struct FileInfo { | |||||||
|     pub mimetype: String, |     pub mimetype: String, | ||||||
|     /// The size of the file in bytes.
 |     /// The size of the file in bytes.
 | ||||||
|     pub size: u64, |     pub size: u64, | ||||||
|  |     /// Metadata about the image referred to in `thumbnail_url`.
 | ||||||
|  |     #[serde(skip_serializing_if="Option::is_none")] | ||||||
|  |     pub thumbnail_info: Option<ThumbnailInfo>, | ||||||
|  |     /// The URL to the thumbnail of the file.
 | ||||||
|  |     #[serde(skip_serializing_if="Option::is_none")] | ||||||
|  |     pub thumbnail_url: Option<String>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /// The payload of an image message.
 | /// The payload of an image message.
 | ||||||
| @ -153,12 +155,6 @@ pub struct ImageMessageEventContent { | |||||||
|     pub info: Option<ImageInfo>, |     pub info: Option<ImageInfo>, | ||||||
|     /// The message type. Always *m.image*.
 |     /// The message type. Always *m.image*.
 | ||||||
|     pub msgtype: MessageType, |     pub msgtype: MessageType, | ||||||
|     /// Metadata about the image referred to in `thumbnail_url`.
 |  | ||||||
|     #[serde(skip_serializing_if="Option::is_none")] |  | ||||||
|     pub thumbnail_info: Option<ImageInfo>, |  | ||||||
|     /// The URL to the thumbnail of the image.
 |  | ||||||
|     #[serde(skip_serializing_if="Option::is_none")] |  | ||||||
|     pub thumbnail_url: Option<String>, |  | ||||||
|     /// The URL to the image.
 |     /// The URL to the image.
 | ||||||
|     pub url: String, |     pub url: String, | ||||||
| } | } | ||||||
| @ -173,9 +169,17 @@ pub struct LocationMessageEventContent { | |||||||
|     pub geo_uri: String, |     pub geo_uri: String, | ||||||
|     /// The message type. Always *m.location*.
 |     /// The message type. Always *m.location*.
 | ||||||
|     pub msgtype: MessageType, |     pub msgtype: MessageType, | ||||||
|  |     /// Info about the location being represented.
 | ||||||
|  |     #[serde(skip_serializing_if="Option::is_none")] | ||||||
|  |     pub info: Option<LocationInfo>, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// Thumbnail info associated with a location.
 | ||||||
|  | #[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] | ||||||
|  | pub struct LocationInfo { | ||||||
|     /// Metadata about the image referred to in `thumbnail_url`.
 |     /// Metadata about the image referred to in `thumbnail_url`.
 | ||||||
|     #[serde(skip_serializing_if="Option::is_none")] |     #[serde(skip_serializing_if="Option::is_none")] | ||||||
|     pub thumbnail_info: Option<ImageInfo>, |     pub thumbnail_info: Option<ThumbnailInfo>, | ||||||
|     /// The URL to a thumbnail of the location being represented.
 |     /// The URL to a thumbnail of the location being represented.
 | ||||||
|     #[serde(skip_serializing_if="Option::is_none")] |     #[serde(skip_serializing_if="Option::is_none")] | ||||||
|     pub thumbnail_url: Option<String>, |     pub thumbnail_url: Option<String>, | ||||||
| @ -232,7 +236,7 @@ pub struct VideoInfo { | |||||||
|     pub size: Option<u64>, |     pub size: Option<u64>, | ||||||
|     /// Metadata about an image.
 |     /// Metadata about an image.
 | ||||||
|     #[serde(skip_serializing_if="Option::is_none")] |     #[serde(skip_serializing_if="Option::is_none")] | ||||||
|     pub thumbnail_info: Option<ImageInfo>, |     pub thumbnail_info: Option<ThumbnailInfo>, | ||||||
|     /// The URL to a thumbnail of the video clip.
 |     /// The URL to a thumbnail of the video clip.
 | ||||||
|     #[serde(skip_serializing_if="Option::is_none")] |     #[serde(skip_serializing_if="Option::is_none")] | ||||||
|     pub thumbnail_url: Option<String>, |     pub thumbnail_url: Option<String>, | ||||||
|  | |||||||
| @ -12,6 +12,7 @@ pub mod join_rules; | |||||||
| pub mod member; | pub mod member; | ||||||
| pub mod message; | pub mod message; | ||||||
| pub mod name; | pub mod name; | ||||||
|  | pub mod pinned_events; | ||||||
| pub mod power_levels; | pub mod power_levels; | ||||||
| pub mod redaction; | pub mod redaction; | ||||||
| pub mod third_party_invite; | pub mod third_party_invite; | ||||||
| @ -27,7 +28,28 @@ pub struct ImageInfo { | |||||||
|     pub mimetype: String, |     pub mimetype: String, | ||||||
|     /// The file size of the image in bytes.
 |     /// The file size of the image in bytes.
 | ||||||
|     pub size: u64, |     pub size: u64, | ||||||
|  |     /// Metadata about the image referred to in `thumbnail_url`.
 | ||||||
|  |     #[serde(skip_serializing_if="Option::is_none")] | ||||||
|  |     pub thumbnail_info: Option<ThumbnailInfo>, | ||||||
|  |     /// The URL to the thumbnail of the image.
 | ||||||
|  |     #[serde(skip_serializing_if="Option::is_none")] | ||||||
|  |     pub thumbnail_url: Option<String>, | ||||||
|     /// The width of the image in pixels.
 |     /// The width of the image in pixels.
 | ||||||
|     #[serde(rename="w")] |     #[serde(rename="w")] | ||||||
|     pub width: u64, |     pub width: u64, | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | /// Metadata about a thumbnail.
 | ||||||
|  | #[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] | ||||||
|  | pub struct ThumbnailInfo { | ||||||
|  |     /// The height of the thumbnail in pixels.
 | ||||||
|  |     #[serde(rename="h")] | ||||||
|  |     pub height: u64, | ||||||
|  |     /// The MIME type of the thumbnail, e.g. "image/png."
 | ||||||
|  |     pub mimetype: String, | ||||||
|  |     /// The file size of the thumbnail in bytes.
 | ||||||
|  |     pub size: u64, | ||||||
|  |     /// The width of the thumbnail in pixels.
 | ||||||
|  |     #[serde(rename="w")] | ||||||
|  |     pub width: u64, | ||||||
|  | } | ||||||
|  | |||||||
							
								
								
									
										63
									
								
								src/room/pinned_events.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								src/room/pinned_events.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,63 @@ | |||||||
|  | //! Types for the *m.room.pinned_events* event.
 | ||||||
|  | 
 | ||||||
|  | use ruma_identifiers::EventId; | ||||||
|  | 
 | ||||||
|  | state_event! { | ||||||
|  |     /// Used to "pin" particular events in a room for other participants to review later.
 | ||||||
|  |     pub struct PinnedEventsEvent(PinnedEventsContent) {} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// The payload of a `NameEvent`.
 | ||||||
|  | #[derive(Clone, Debug, Deserialize, Serialize)] | ||||||
|  | pub struct PinnedEventsContent { | ||||||
|  |     /// An ordered list of event IDs to pin.
 | ||||||
|  |     pub pinned: Vec<EventId>, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #[cfg(test)] | ||||||
|  | mod tests { | ||||||
|  |     use ruma_identifiers::{EventId, RoomId, UserId}; | ||||||
|  |     use serde_json::{from_str, to_string}; | ||||||
|  | 
 | ||||||
|  |     use Event; | ||||||
|  |     use EventType; | ||||||
|  |     use RoomEvent; | ||||||
|  |     use StateEvent; | ||||||
|  |     use room::pinned_events::{PinnedEventsEvent, PinnedEventsContent}; | ||||||
|  | 
 | ||||||
|  |     #[test] | ||||||
|  |     fn serialization_deserialization() { | ||||||
|  |         let mut content: PinnedEventsContent = PinnedEventsContent { | ||||||
|  |             pinned: Vec::new() | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         content.pinned.push(EventId::new("example.com").unwrap()); | ||||||
|  |         content.pinned.push(EventId::new("example.com").unwrap()); | ||||||
|  | 
 | ||||||
|  |         let event = PinnedEventsEvent { | ||||||
|  |             content: content.clone(), | ||||||
|  |             event_id: EventId::new("example.com").unwrap(), | ||||||
|  |             event_type: EventType::RoomPinnedEvents, | ||||||
|  |             origin_server_ts: 1432804485886, | ||||||
|  |             prev_content: None, | ||||||
|  |             room_id: RoomId::new("example.com").unwrap(), | ||||||
|  |             sender: UserId::new("example.com").unwrap(), | ||||||
|  |             state_key: "".to_string(), | ||||||
|  |             unsigned: None, | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         let serialized_event = to_string(&event).unwrap(); | ||||||
|  |         let parsed_event: PinnedEventsEvent = from_str(&serialized_event).unwrap(); | ||||||
|  | 
 | ||||||
|  |         assert_eq!(parsed_event.event_id(), event.event_id()); | ||||||
|  |         assert_eq!(parsed_event.room_id(), event.room_id()); | ||||||
|  |         assert_eq!(parsed_event.sender(), event.sender()); | ||||||
|  |         assert_eq!(parsed_event.unsigned(), event.unsigned()); | ||||||
|  |         assert_eq!(parsed_event.state_key(), event.state_key()); | ||||||
|  |         assert_eq!(parsed_event.origin_server_ts(), event.origin_server_ts()); | ||||||
|  | 
 | ||||||
|  |         assert_eq!(parsed_event.content().pinned, event.content.pinned); | ||||||
|  |         assert_eq!(parsed_event.content().pinned[0], content.pinned[0]); | ||||||
|  |         assert_eq!(parsed_event.content().pinned[1], content.pinned[1]); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -294,7 +294,14 @@ mod tests { | |||||||
|                     "h": 128, |                     "h": 128, | ||||||
|                     "w": 128, |                     "w": 128, | ||||||
|                     "mimetype": "image/jpeg", |                     "mimetype": "image/jpeg", | ||||||
|                     "size": 1024 |                     "size": 1024, | ||||||
|  |                     "thumbnail_info": { | ||||||
|  |                         "h": 16, | ||||||
|  |                         "w": 16, | ||||||
|  |                         "mimetype": "image/jpeg", | ||||||
|  |                         "size": 32 | ||||||
|  |                     }, | ||||||
|  |                     "thumbnail_url": "https://domain.com/image-thumbnail.jpg" | ||||||
|                 }, |                 }, | ||||||
|                 "thumbnail_info": { |                 "thumbnail_info": { | ||||||
|                     "h": 16, |                     "h": 16, | ||||||
|  | |||||||
| @ -1,6 +1,6 @@ | |||||||
| //! Types for the *m.typing* event.
 | //! Types for the *m.typing* event.
 | ||||||
| 
 | 
 | ||||||
| use ruma_identifiers::{EventId, RoomId}; | use ruma_identifiers::{RoomId, UserId}; | ||||||
| 
 | 
 | ||||||
| event! { | event! { | ||||||
|     /// Informs the client of the list of users currently typing.
 |     /// Informs the client of the list of users currently typing.
 | ||||||
| @ -14,5 +14,5 @@ event! { | |||||||
| #[derive(Clone, Debug, Deserialize, Serialize)] | #[derive(Clone, Debug, Deserialize, Serialize)] | ||||||
| pub struct TypingEventContent { | pub struct TypingEventContent { | ||||||
|     /// The list of user IDs typing in this room, if any.
 |     /// The list of user IDs typing in this room, if any.
 | ||||||
|     pub user_ids: Vec<EventId>, |     pub user_ids: Vec<UserId>, | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user