Remove Event, RoomEvent and StateEvent traits
This commit is contained in:
		
							parent
							
								
									c1ee72db0f
								
							
						
					
					
						commit
						3d01bfa96d
					
				| @ -1,4 +1,7 @@ | ||||
| //! Details of generating code for the `ruma_event` procedural macro.
 | ||||
| 
 | ||||
| #![allow(dead_code)] | ||||
| 
 | ||||
| use proc_macro2::{Span, TokenStream}; | ||||
| use quote::{format_ident, quote, quote_spanned, ToTokens}; | ||||
| use syn::{ | ||||
| @ -75,18 +78,9 @@ impl ToTokens for RumaEvent { | ||||
|     // allowance.
 | ||||
|     #[allow(clippy::cognitive_complexity)] | ||||
|     fn to_tokens(&self, tokens: &mut TokenStream) { | ||||
|         let attrs = &self.attrs; | ||||
|         // let attrs = &self.attrs;
 | ||||
|         let content_name = &self.content_name; | ||||
|         let event_fields = &self.fields; | ||||
| 
 | ||||
|         let event_type_variant = { | ||||
|             let event_type = to_camel_case(self.event_type.value()); | ||||
|             let variant = Ident::new(&event_type, event_type.span()); | ||||
| 
 | ||||
|             quote! { | ||||
|                 ::ruma_events::EventType::#variant | ||||
|             } | ||||
|         }; | ||||
|         // let event_fields = &self.fields;
 | ||||
| 
 | ||||
|         let name = &self.name; | ||||
|         let content_docstring = format!("The payload for `{}`.", name); | ||||
| @ -125,61 +119,6 @@ impl ToTokens for RumaEvent { | ||||
|             Content::Typedef(_) => TokenStream::new(), | ||||
|         }; | ||||
| 
 | ||||
|         let impl_room_event = match self.kind { | ||||
|             EventKind::RoomEvent | EventKind::StateEvent => { | ||||
|                 quote! { | ||||
|                     impl ::ruma_events::RoomEvent for #name { | ||||
|                         /// The unique identifier for the event.
 | ||||
|                         fn event_id(&self) -> &ruma_identifiers::EventId { | ||||
|                             &self.event_id | ||||
|                         } | ||||
| 
 | ||||
|                         /// Time on originating homeserver when this event was sent.
 | ||||
|                         fn origin_server_ts(&self) -> std::time::SystemTime { | ||||
|                             self.origin_server_ts | ||||
|                         } | ||||
| 
 | ||||
|                         /// The unique identifier for the room associated with this event.
 | ||||
|                         ///
 | ||||
|                         /// This can be `None` if the event came from a context where there is
 | ||||
|                         /// no ambiguity which room it belongs to, like a `/sync` response for example.
 | ||||
|                         fn room_id(&self) -> Option<&ruma_identifiers::RoomId> { | ||||
|                             self.room_id.as_ref() | ||||
|                         } | ||||
| 
 | ||||
|                         /// The unique identifier for the user who sent this event.
 | ||||
|                         fn sender(&self) -> &ruma_identifiers::UserId { | ||||
|                             &self.sender | ||||
|                         } | ||||
| 
 | ||||
|                         /// Additional key-value pairs not signed by the homeserver.
 | ||||
|                         fn unsigned(&self) -> &ruma_events::UnsignedData { | ||||
|                             &self.unsigned | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             _ => TokenStream::new(), | ||||
|         }; | ||||
| 
 | ||||
|         let impl_state_event = if self.kind == EventKind::StateEvent { | ||||
|             quote! { | ||||
|                 impl ::ruma_events::StateEvent for #name { | ||||
|                     /// The previous content for this state key, if any.
 | ||||
|                     fn prev_content(&self) -> Option<&Self::Content> { | ||||
|                         self.prev_content.as_ref() | ||||
|                     } | ||||
| 
 | ||||
|                     /// A key that determines which piece of room state the event represents.
 | ||||
|                     fn state_key(&self) -> &str { | ||||
|                         &self.state_key | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } else { | ||||
|             TokenStream::new() | ||||
|         }; | ||||
| 
 | ||||
|         let impl_event_result_compatible_for_content = | ||||
|             if let Content::Struct(content_fields) = &self.content { | ||||
|                 let mut content_field_values: Vec<TokenStream> = | ||||
| @ -213,48 +152,16 @@ impl ToTokens for RumaEvent { | ||||
|                 TokenStream::new() | ||||
|             }; | ||||
| 
 | ||||
|         let event_type_name = self.event_type.value(); | ||||
|         // let event_type_name = self.event_type.value();
 | ||||
|         let output = quote!( | ||||
|             #(#attrs)* | ||||
|             #[derive(Clone, Debug, serde::Serialize, ruma_events_macros::FromRaw)] | ||||
|             #[serde(rename = #event_type_name, tag = "type")] | ||||
|             pub struct #name { | ||||
|                 #(#event_fields),* | ||||
|             } | ||||
| 
 | ||||
|             #content | ||||
| 
 | ||||
|             #impl_event_result_compatible_for_content | ||||
| 
 | ||||
|             impl ::ruma_events::Event for #name { | ||||
|                 /// The type of this event's `content` field.
 | ||||
|                 type Content = #content_name; | ||||
| 
 | ||||
|                 /// The event's content.
 | ||||
|                 fn content(&self) -> &Self::Content { | ||||
|                     &self.content | ||||
|                 } | ||||
| 
 | ||||
|                 /// The type of the event.
 | ||||
|                 fn event_type(&self) -> ::ruma_events::EventType { | ||||
|                     #event_type_variant | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             #impl_room_event | ||||
| 
 | ||||
|             #impl_state_event | ||||
| 
 | ||||
|             /// "Raw" versions of the event and its content which implement `serde::Deserialize`.
 | ||||
|             pub(crate) mod raw { | ||||
|                 use super::*; | ||||
| 
 | ||||
|                 #(#attrs)* | ||||
|                 #[derive(Clone, Debug, serde::Deserialize)] | ||||
|                 pub struct #name { | ||||
|                     #(#event_fields),* | ||||
|                 } | ||||
| 
 | ||||
|                 #raw_content | ||||
|             } | ||||
|         ); | ||||
|  | ||||
							
								
								
									
										119
									
								
								src/custom.rs
									
									
									
									
									
								
							
							
						
						
									
										119
									
								
								src/custom.rs
									
									
									
									
									
								
							| @ -2,7 +2,7 @@ | ||||
| 
 | ||||
| use std::time::SystemTime; | ||||
| 
 | ||||
| use crate::{Event, EventType, RoomEvent, StateEvent, UnsignedData}; | ||||
| use crate::{EventType, UnsignedData}; | ||||
| 
 | ||||
| use ruma_events_macros::FromRaw; | ||||
| use ruma_identifiers::{EventId, RoomId, UserId}; | ||||
| @ -22,21 +22,6 @@ pub struct CustomEvent { | ||||
| /// The payload for `CustomEvent`.
 | ||||
| pub type CustomEventContent = JsonValue; | ||||
| 
 | ||||
| impl Event for CustomEvent { | ||||
|     /// The type of this event's `content` field.
 | ||||
|     type Content = CustomEventContent; | ||||
| 
 | ||||
|     /// The event's content.
 | ||||
|     fn content(&self) -> &Self::Content { | ||||
|         &self.content | ||||
|     } | ||||
| 
 | ||||
|     /// The type of the event.
 | ||||
|     fn event_type(&self) -> EventType { | ||||
|         EventType::Custom(self.event_type.clone()) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /// A custom room event not covered by the Matrix specification.
 | ||||
| #[derive(Clone, Debug, FromRaw, Serialize)] | ||||
| pub struct CustomRoomEvent { | ||||
| @ -62,51 +47,6 @@ pub struct CustomRoomEvent { | ||||
| /// The payload for `CustomRoomEvent`.
 | ||||
| pub type CustomRoomEventContent = JsonValue; | ||||
| 
 | ||||
| impl Event for CustomRoomEvent { | ||||
|     /// The type of this event's `content` field.
 | ||||
|     type Content = CustomRoomEventContent; | ||||
| 
 | ||||
|     /// The event's content.
 | ||||
|     fn content(&self) -> &Self::Content { | ||||
|         &self.content | ||||
|     } | ||||
| 
 | ||||
|     /// The type of the event.
 | ||||
|     fn event_type(&self) -> EventType { | ||||
|         EventType::Custom(self.event_type.clone()) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl RoomEvent for CustomRoomEvent { | ||||
|     /// The unique identifier for the event.
 | ||||
|     fn event_id(&self) -> &EventId { | ||||
|         &self.event_id | ||||
|     } | ||||
| 
 | ||||
|     /// Time on originating homeserver when this event was sent.
 | ||||
|     fn origin_server_ts(&self) -> SystemTime { | ||||
|         self.origin_server_ts | ||||
|     } | ||||
| 
 | ||||
|     /// The unique identifier for the room associated with this event.
 | ||||
|     ///
 | ||||
|     /// This can be `None` if the event came from a context where there is
 | ||||
|     /// no ambiguity which room it belongs to, like a `/sync` response for example.
 | ||||
|     fn room_id(&self) -> Option<&RoomId> { | ||||
|         self.room_id.as_ref() | ||||
|     } | ||||
| 
 | ||||
|     /// The unique identifier for the user who sent this event.
 | ||||
|     fn sender(&self) -> &UserId { | ||||
|         &self.sender | ||||
|     } | ||||
| 
 | ||||
|     /// Additional key-value pairs not signed by the homeserver.
 | ||||
|     fn unsigned(&self) -> &UnsignedData { | ||||
|         &self.unsigned | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| /// A custom state event not covered by the Matrix specification.
 | ||||
| #[derive(Clone, Debug, FromRaw, Serialize)] | ||||
| pub struct CustomStateEvent { | ||||
| @ -136,63 +76,6 @@ pub struct CustomStateEvent { | ||||
| /// The payload for `CustomStateEvent`.
 | ||||
| pub type CustomStateEventContent = JsonValue; | ||||
| 
 | ||||
| impl Event for CustomStateEvent { | ||||
|     /// The type of this event's `content` field.
 | ||||
|     type Content = CustomStateEventContent; | ||||
| 
 | ||||
|     /// The event's content.
 | ||||
|     fn content(&self) -> &Self::Content { | ||||
|         &self.content | ||||
|     } | ||||
| 
 | ||||
|     /// The type of the event.
 | ||||
|     fn event_type(&self) -> EventType { | ||||
|         EventType::Custom(self.event_type.clone()) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl RoomEvent for CustomStateEvent { | ||||
|     /// The unique identifier for the event.
 | ||||
|     fn event_id(&self) -> &EventId { | ||||
|         &self.event_id | ||||
|     } | ||||
| 
 | ||||
|     /// Time on originating homeserver when this event was sent.
 | ||||
|     fn origin_server_ts(&self) -> SystemTime { | ||||
|         self.origin_server_ts | ||||
|     } | ||||
| 
 | ||||
|     /// The unique identifier for the room associated with this event.
 | ||||
|     ///
 | ||||
|     /// This can be `None` if the event came from a context where there is
 | ||||
|     /// no ambiguity which room it belongs to, like a `/sync` response for example.
 | ||||
|     fn room_id(&self) -> Option<&RoomId> { | ||||
|         self.room_id.as_ref() | ||||
|     } | ||||
| 
 | ||||
|     /// The unique identifier for the user who sent this event.
 | ||||
|     fn sender(&self) -> &UserId { | ||||
|         &self.sender | ||||
|     } | ||||
| 
 | ||||
|     /// Additional key-value pairs not signed by the homeserver.
 | ||||
|     fn unsigned(&self) -> &UnsignedData { | ||||
|         &self.unsigned | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl StateEvent for CustomStateEvent { | ||||
|     /// The previous content for this state key, if any.
 | ||||
|     fn prev_content(&self) -> Option<&Self::Content> { | ||||
|         self.prev_content.as_ref() | ||||
|     } | ||||
| 
 | ||||
|     /// A key that determines which piece of room state the event represents.
 | ||||
|     fn state_key(&self) -> &str { | ||||
|         &self.state_key | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub(crate) mod raw { | ||||
|     use std::time::SystemTime; | ||||
| 
 | ||||
|  | ||||
| @ -6,7 +6,7 @@ use serde::{Deserialize, Serialize}; | ||||
| use super::{ | ||||
|     HashAlgorithm, KeyAgreementProtocol, MessageAuthenticationCode, ShortAuthenticationString, | ||||
| }; | ||||
| use crate::{EventType, InvalidInput, TryFromRaw}; | ||||
| use crate::{InvalidInput, TryFromRaw}; | ||||
| 
 | ||||
| /// Begins an SAS key verification process.
 | ||||
| ///
 | ||||
| @ -36,12 +36,6 @@ impl TryFromRaw for StartEvent { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl_event!( | ||||
|     StartEvent, | ||||
|     StartEventContent, | ||||
|     EventType::KeyVerificationStart | ||||
| ); | ||||
| 
 | ||||
| impl TryFromRaw for StartEventContent { | ||||
|     type Raw = raw::StartEventContent; | ||||
|     type Err = &'static str; | ||||
|  | ||||
							
								
								
									
										93
									
								
								src/lib.rs
									
									
									
									
									
								
							
							
						
						
									
										93
									
								
								src/lib.rs
									
									
									
									
									
								
							| @ -113,23 +113,22 @@ | ||||
| #![warn(missing_debug_implementations, missing_docs, rust_2018_idioms)] | ||||
| // Since we support Rust 1.36.0, we can't apply this suggestion yet
 | ||||
| #![allow(clippy::use_self)] | ||||
| #![allow(dead_code)] | ||||
| #![allow(unused_imports)] | ||||
| 
 | ||||
| use std::{fmt::Debug, time::SystemTime}; | ||||
| use std::fmt::Debug; | ||||
| 
 | ||||
| use js_int::Int; | ||||
| use ruma_identifiers::{EventId, RoomId, UserId}; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| 
 | ||||
| use self::room::redaction::RedactionEvent; | ||||
| // use self::room::redaction::RedactionEvent;
 | ||||
| 
 | ||||
| pub use self::custom::{CustomEvent, CustomRoomEvent, CustomStateEvent}; | ||||
| 
 | ||||
| #[deprecated = "Use ruma_serde::empty::Empty directly instead."] | ||||
| pub use ruma_serde::empty::Empty; | ||||
| 
 | ||||
| #[macro_use] | ||||
| mod macros; | ||||
| 
 | ||||
| mod algorithm; | ||||
| mod error; | ||||
| mod event_type; | ||||
| @ -145,31 +144,31 @@ extern crate self as ruma_events; | ||||
| pub mod call; | ||||
| pub mod custom; | ||||
| /// Enums for heterogeneous collections of events.
 | ||||
| pub mod collections { | ||||
|     pub mod all; | ||||
|     pub mod only; | ||||
| // pub mod collections {
 | ||||
| //     pub mod all;
 | ||||
| //     pub mod only;
 | ||||
| 
 | ||||
|     mod raw { | ||||
|         pub mod all; | ||||
|         pub mod only; | ||||
|     } | ||||
| } | ||||
| pub mod direct; | ||||
| pub mod dummy; | ||||
| //     mod raw {
 | ||||
| //         pub mod all;
 | ||||
| //         pub mod only;
 | ||||
| //     }
 | ||||
| // }
 | ||||
| // pub mod direct;
 | ||||
| // pub mod dummy;
 | ||||
| pub mod forwarded_room_key; | ||||
| pub mod fully_read; | ||||
| pub mod ignored_user_list; | ||||
| // pub mod ignored_user_list;
 | ||||
| pub mod key; | ||||
| pub mod presence; | ||||
| pub mod push_rules; | ||||
| // pub mod presence;
 | ||||
| // pub mod push_rules;
 | ||||
| pub mod receipt; | ||||
| pub mod room; | ||||
| pub mod room_key; | ||||
| // pub mod room_key;
 | ||||
| pub mod room_key_request; | ||||
| pub mod sticker; | ||||
| pub mod stripped; | ||||
| // pub mod stripped;
 | ||||
| pub mod tag; | ||||
| pub mod to_device; | ||||
| // pub mod to_device;
 | ||||
| pub mod typing; | ||||
| 
 | ||||
| pub use self::{ | ||||
| @ -180,48 +179,6 @@ pub use self::{ | ||||
|     json::EventJson, | ||||
| }; | ||||
| 
 | ||||
| /// A basic event.
 | ||||
| pub trait Event: Debug + Serialize + Sized + TryFromRaw { | ||||
|     /// The type of this event's `content` field.
 | ||||
|     type Content: Debug + Serialize; | ||||
| 
 | ||||
|     /// The event's content.
 | ||||
|     fn content(&self) -> &Self::Content; | ||||
| 
 | ||||
|     /// The type of the event.
 | ||||
|     fn event_type(&self) -> EventType; | ||||
| } | ||||
| 
 | ||||
| /// An event within the context of a room.
 | ||||
| pub trait RoomEvent: Event { | ||||
|     /// The unique identifier for the event.
 | ||||
|     fn event_id(&self) -> &EventId; | ||||
| 
 | ||||
|     /// Time on originating homeserver when this event was sent.
 | ||||
|     fn origin_server_ts(&self) -> SystemTime; | ||||
| 
 | ||||
|     /// The unique identifier for the room associated with this event.
 | ||||
|     ///
 | ||||
|     /// This can be `None` if the event came from a context where there is
 | ||||
|     /// no ambiguity which room it belongs to, like a `/sync` response for example.
 | ||||
|     fn room_id(&self) -> Option<&RoomId>; | ||||
| 
 | ||||
|     /// The unique identifier for the user who sent this event.
 | ||||
|     fn sender(&self) -> &UserId; | ||||
| 
 | ||||
|     /// Additional key-value pairs not signed by the homeserver.
 | ||||
|     fn unsigned(&self) -> &UnsignedData; | ||||
| } | ||||
| 
 | ||||
| /// An event that describes persistent state about a room.
 | ||||
| pub trait StateEvent: RoomEvent { | ||||
|     /// The previous content for this state key, if any.
 | ||||
|     fn prev_content(&self) -> Option<&Self::Content>; | ||||
| 
 | ||||
|     /// A key that determines which piece of room state the event represents.
 | ||||
|     fn state_key(&self) -> &str; | ||||
| } | ||||
| 
 | ||||
| /// Extra information about an event that is not incorporated into the event's
 | ||||
| /// hash.
 | ||||
| #[derive(Clone, Debug, Default, Deserialize, Serialize)] | ||||
| @ -233,10 +190,9 @@ pub struct UnsignedData { | ||||
|     #[serde(skip_serializing_if = "Option::is_none")] | ||||
|     pub age: Option<Int>, | ||||
| 
 | ||||
|     /// The event that redacted this event, if any.
 | ||||
|     #[serde(skip_serializing_if = "Option::is_none")] | ||||
|     pub redacted_because: Option<EventJson<RedactionEvent>>, | ||||
| 
 | ||||
|     // /// The event that redacted this event, if any.
 | ||||
|     // #[serde(skip_serializing_if = "Option::is_none")]
 | ||||
|     // pub redacted_because: Option<EventJson<RedactionEvent>>,
 | ||||
|     /// The client-supplied transaction ID, if the client being given the event
 | ||||
|     /// is the same one which sent it.
 | ||||
|     #[serde(skip_serializing_if = "Option::is_none")] | ||||
| @ -251,6 +207,7 @@ impl UnsignedData { | ||||
|     /// an incoming `unsigned` field was present - it could still have been
 | ||||
|     /// present but contained none of the known fields.
 | ||||
|     pub fn is_empty(&self) -> bool { | ||||
|         self.age.is_none() && self.redacted_because.is_none() && self.transaction_id.is_none() | ||||
|         self.age.is_none() && self.transaction_id.is_none() | ||||
|         //   && self.redacted_because.is_none()
 | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1,82 +0,0 @@ | ||||
| macro_rules! impl_event { | ||||
|     ($name:ident, $content_name:ident, $event_type:path) => { | ||||
|         impl crate::Event for $name { | ||||
|             /// The type of this event's `content` field.
 | ||||
|             type Content = $content_name; | ||||
| 
 | ||||
|             /// The event's content.
 | ||||
|             fn content(&self) -> &Self::Content { | ||||
|                 &self.content | ||||
|             } | ||||
| 
 | ||||
|             /// The type of the event.
 | ||||
|             fn event_type(&self) -> crate::EventType { | ||||
|                 $event_type | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| macro_rules! impl_room_event { | ||||
|     ($name:ident, $content_name:ident, $event_type:path) => { | ||||
|         impl_event!($name, $content_name, $event_type); | ||||
| 
 | ||||
|         impl crate::RoomEvent for $name { | ||||
|             /// The unique identifier for the event.
 | ||||
|             fn event_id(&self) -> &EventId { | ||||
|                 &self.event_id | ||||
|             } | ||||
| 
 | ||||
|             /// Time on originating homeserver when this event was sent.
 | ||||
|             fn origin_server_ts(&self) -> ::std::time::SystemTime { | ||||
|                 self.origin_server_ts | ||||
|             } | ||||
| 
 | ||||
|             /// The unique identifier for the room associated with this event.
 | ||||
|             ///
 | ||||
|             /// This can be `None` if the event came from a context where there is
 | ||||
|             /// no ambiguity which room it belongs to, like a `/sync` response for example.
 | ||||
|             fn room_id(&self) -> Option<&::ruma_identifiers::RoomId> { | ||||
|                 self.room_id.as_ref() | ||||
|             } | ||||
| 
 | ||||
|             /// The unique identifier for the user who sent this event.
 | ||||
|             fn sender(&self) -> &::ruma_identifiers::UserId { | ||||
|                 &self.sender | ||||
|             } | ||||
| 
 | ||||
|             /// Additional key-value pairs not signed by the homeserver.
 | ||||
|             fn unsigned(&self) -> &::ruma_events::UnsignedData { | ||||
|                 &self.unsigned | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| macro_rules! impl_state_event { | ||||
|     ($name:ident, $content_name:ident, $event_type:path) => { | ||||
|         impl_room_event!($name, $content_name, $event_type); | ||||
| 
 | ||||
|         impl crate::StateEvent for $name { | ||||
|             /// The previous content for this state key, if any.
 | ||||
|             fn prev_content(&self) -> Option<&Self::Content> { | ||||
|                 self.prev_content.as_ref() | ||||
|             } | ||||
| 
 | ||||
|             /// A key that determines which piece of room state the event represents.
 | ||||
|             fn state_key(&self) -> &str { | ||||
|                 &self.state_key | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
| } | ||||
| 
 | ||||
| macro_rules! impl_from_for_enum { | ||||
|     ($self_ty:ident, $inner_ty:ty, $variant:ident) => { | ||||
|         impl ::std::convert::From<$inner_ty> for $self_ty { | ||||
|             fn from(event: $inner_ty) -> Self { | ||||
|                 $self_ty::$variant(event) | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
| } | ||||
| @ -51,7 +51,7 @@ mod tests { | ||||
|     use ruma_identifiers::UserId; | ||||
|     use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | ||||
| 
 | ||||
|     use super::{PresenceEvent, PresenceEventContent, PresenceState}; | ||||
|     use super::{PresenceEventContent, PresenceState}; | ||||
|     use crate::EventJson; | ||||
| 
 | ||||
|     #[test] | ||||
|  | ||||
| @ -153,7 +153,7 @@ mod tests { | ||||
|     use matches::assert_matches; | ||||
|     use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | ||||
| 
 | ||||
|     use super::{PushCondition, PushRulesEvent}; | ||||
|     use super::PushCondition; | ||||
|     use crate::EventJson; | ||||
| 
 | ||||
|     #[test] | ||||
|  | ||||
							
								
								
									
										14
									
								
								src/room.rs
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								src/room.rs
									
									
									
									
									
								
							| @ -9,20 +9,20 @@ use serde::{Deserialize, Serialize}; | ||||
| 
 | ||||
| pub mod aliases; | ||||
| pub mod avatar; | ||||
| pub mod canonical_alias; | ||||
| // pub mod canonical_alias;
 | ||||
| pub mod create; | ||||
| pub mod encrypted; | ||||
| pub mod encryption; | ||||
| pub mod guest_access; | ||||
| pub mod history_visibility; | ||||
| pub mod join_rules; | ||||
| pub mod member; | ||||
| pub mod message; | ||||
| pub mod name; | ||||
| pub mod pinned_events; | ||||
| pub mod power_levels; | ||||
| // pub mod member;
 | ||||
| // pub mod message;
 | ||||
| // pub mod name;
 | ||||
| // pub mod pinned_events;
 | ||||
| // pub mod power_levels;
 | ||||
| pub mod redaction; | ||||
| pub mod server_acl; | ||||
| // pub mod server_acl;
 | ||||
| pub mod third_party_invite; | ||||
| pub mod tombstone; | ||||
| pub mod topic; | ||||
|  | ||||
| @ -6,36 +6,7 @@ use js_int::UInt; | ||||
| use ruma_identifiers::{DeviceId, EventId, RoomId, UserId}; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| 
 | ||||
| use crate::{EventType, FromRaw, UnsignedData}; | ||||
| 
 | ||||
| /// This event type is used when sending encrypted events.
 | ||||
| ///
 | ||||
| /// This type is to be used within a room. For a to-device event, use `EncryptedEventContent`
 | ||||
| /// directly.
 | ||||
| #[derive(Clone, Debug, Serialize)] | ||||
| #[serde(tag = "type", rename = "m.room.encrypted")] | ||||
| pub struct EncryptedEvent { | ||||
|     /// The event's content.
 | ||||
|     pub content: EncryptedEventContent, | ||||
| 
 | ||||
|     /// The unique identifier for the event.
 | ||||
|     pub event_id: EventId, | ||||
| 
 | ||||
|     /// Time on originating homeserver when this event was sent.
 | ||||
|     #[serde(with = "ruma_serde::time::ms_since_unix_epoch")] | ||||
|     pub origin_server_ts: SystemTime, | ||||
| 
 | ||||
|     /// The unique identifier for the room associated with this event.
 | ||||
|     #[serde(skip_serializing_if = "Option::is_none")] | ||||
|     pub room_id: Option<RoomId>, | ||||
| 
 | ||||
|     /// The unique identifier for the user who sent this event.
 | ||||
|     pub sender: UserId, | ||||
| 
 | ||||
|     /// Additional key-value pairs not signed by the homeserver.
 | ||||
|     #[serde(skip_serializing_if = "UnsignedData::is_empty")] | ||||
|     pub unsigned: UnsignedData, | ||||
| } | ||||
| use crate::{FromRaw, UnsignedData}; | ||||
| 
 | ||||
| /// The payload for `EncryptedEvent`.
 | ||||
| #[derive(Clone, Debug, Serialize)] | ||||
| @ -51,21 +22,6 @@ pub enum EncryptedEventContent { | ||||
|     MegolmV1AesSha2(MegolmV1AesSha2Content), | ||||
| } | ||||
| 
 | ||||
| impl FromRaw for EncryptedEvent { | ||||
|     type Raw = raw::EncryptedEvent; | ||||
| 
 | ||||
|     fn from_raw(raw: raw::EncryptedEvent) -> Self { | ||||
|         Self { | ||||
|             content: FromRaw::from_raw(raw.content), | ||||
|             event_id: raw.event_id, | ||||
|             origin_server_ts: raw.origin_server_ts, | ||||
|             room_id: raw.room_id, | ||||
|             sender: raw.sender, | ||||
|             unsigned: raw.unsigned, | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl FromRaw for EncryptedEventContent { | ||||
|     type Raw = raw::EncryptedEventContent; | ||||
| 
 | ||||
| @ -81,12 +37,6 @@ impl FromRaw for EncryptedEventContent { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl_room_event!( | ||||
|     EncryptedEvent, | ||||
|     EncryptedEventContent, | ||||
|     EventType::RoomEncrypted | ||||
| ); | ||||
| 
 | ||||
| pub(crate) mod raw { | ||||
|     use std::time::SystemTime; | ||||
| 
 | ||||
| @ -96,33 +46,6 @@ pub(crate) mod raw { | ||||
|     use super::{MegolmV1AesSha2Content, OlmV1Curve25519AesSha2Content}; | ||||
|     use crate::UnsignedData; | ||||
| 
 | ||||
|     /// This event type is used when sending encrypted events.
 | ||||
|     ///
 | ||||
|     /// This type is to be used within a room. For a to-device event, use `EncryptedEventContent`
 | ||||
|     /// directly.
 | ||||
|     #[derive(Clone, Debug, Deserialize)] | ||||
|     pub struct EncryptedEvent { | ||||
|         /// The event's content.
 | ||||
|         pub content: EncryptedEventContent, | ||||
| 
 | ||||
|         /// The unique identifier for the event.
 | ||||
|         pub event_id: EventId, | ||||
| 
 | ||||
|         /// Time on originating homeserver when this event was sent.
 | ||||
|         #[serde(with = "ruma_serde::time::ms_since_unix_epoch")] | ||||
|         pub origin_server_ts: SystemTime, | ||||
| 
 | ||||
|         /// The unique identifier for the room associated with this event.
 | ||||
|         pub room_id: Option<RoomId>, | ||||
| 
 | ||||
|         /// The unique identifier for the user who sent this event.
 | ||||
|         pub sender: UserId, | ||||
| 
 | ||||
|         /// Additional key-value pairs not signed by the homeserver.
 | ||||
|         #[serde(default)] | ||||
|         pub unsigned: UnsignedData, | ||||
|     } | ||||
| 
 | ||||
|     /// The payload for `EncryptedEvent`.
 | ||||
|     #[derive(Clone, Debug, Deserialize)] | ||||
|     #[serde(tag = "algorithm")] | ||||
|  | ||||
| @ -154,44 +154,44 @@ pub enum MembershipChange { | ||||
|     NotImplemented, | ||||
| } | ||||
| 
 | ||||
| impl MemberEvent { | ||||
|     /// Helper function for membership change. Check [the specification][spec] for details.
 | ||||
|     ///
 | ||||
|     /// [spec]: https://matrix.org/docs/spec/client_server/latest#m-room-member
 | ||||
|     pub fn membership_change(&self) -> MembershipChange { | ||||
|         use MembershipState::*; | ||||
|         let prev_membership = if let Some(prev_content) = &self.prev_content { | ||||
|             prev_content.membership | ||||
|         } else { | ||||
|             Leave | ||||
|         }; | ||||
|         match (prev_membership, &self.content.membership) { | ||||
|             (Invite, Invite) | (Leave, Leave) | (Ban, Ban) => MembershipChange::None, | ||||
|             (Invite, Join) | (Leave, Join) => MembershipChange::Joined, | ||||
|             (Invite, Leave) => { | ||||
|                 if self.sender == self.state_key { | ||||
|                     MembershipChange::InvitationRevoked | ||||
|                 } else { | ||||
|                     MembershipChange::InvitationRejected | ||||
|                 } | ||||
|             } | ||||
|             (Invite, Ban) | (Leave, Ban) => MembershipChange::Banned, | ||||
|             (Join, Invite) | (Ban, Invite) | (Ban, Join) => MembershipChange::Error, | ||||
|             (Join, Join) => MembershipChange::ProfileChanged, | ||||
|             (Join, Leave) => { | ||||
|                 if self.sender == self.state_key { | ||||
|                     MembershipChange::Left | ||||
|                 } else { | ||||
|                     MembershipChange::Kicked | ||||
|                 } | ||||
|             } | ||||
|             (Join, Ban) => MembershipChange::KickedAndBanned, | ||||
|             (Leave, Invite) => MembershipChange::Invited, | ||||
|             (Ban, Leave) => MembershipChange::Unbanned, | ||||
|             (Knock, _) | (_, Knock) => MembershipChange::NotImplemented, | ||||
|         } | ||||
|     } | ||||
| } | ||||
| // impl MemberEvent {
 | ||||
| //     /// Helper function for membership change. Check [the specification][spec] for details.
 | ||||
| //     ///
 | ||||
| //     /// [spec]: https://matrix.org/docs/spec/client_server/latest#m-room-member
 | ||||
| //     pub fn membership_change(&self) -> MembershipChange {
 | ||||
| //         use MembershipState::*;
 | ||||
| //         let prev_membership = if let Some(prev_content) = &self.prev_content {
 | ||||
| //             prev_content.membership
 | ||||
| //         } else {
 | ||||
| //             Leave
 | ||||
| //         };
 | ||||
| //         match (prev_membership, &self.content.membership) {
 | ||||
| //             (Invite, Invite) | (Leave, Leave) | (Ban, Ban) => MembershipChange::None,
 | ||||
| //             (Invite, Join) | (Leave, Join) => MembershipChange::Joined,
 | ||||
| //             (Invite, Leave) => {
 | ||||
| //                 if self.sender == self.state_key {
 | ||||
| //                     MembershipChange::InvitationRevoked
 | ||||
| //                 } else {
 | ||||
| //                     MembershipChange::InvitationRejected
 | ||||
| //                 }
 | ||||
| //             }
 | ||||
| //             (Invite, Ban) | (Leave, Ban) => MembershipChange::Banned,
 | ||||
| //             (Join, Invite) | (Ban, Invite) | (Ban, Join) => MembershipChange::Error,
 | ||||
| //             (Join, Join) => MembershipChange::ProfileChanged,
 | ||||
| //             (Join, Leave) => {
 | ||||
| //                 if self.sender == self.state_key {
 | ||||
| //                     MembershipChange::Left
 | ||||
| //                 } else {
 | ||||
| //                     MembershipChange::Kicked
 | ||||
| //                 }
 | ||||
| //             }
 | ||||
| //             (Join, Ban) => MembershipChange::KickedAndBanned,
 | ||||
| //             (Leave, Invite) => MembershipChange::Invited,
 | ||||
| //             (Ban, Leave) => MembershipChange::Unbanned,
 | ||||
| //             (Knock, _) | (_, Knock) => MembershipChange::NotImplemented,
 | ||||
| //         }
 | ||||
| //     }
 | ||||
| // }
 | ||||
| 
 | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|  | ||||
| @ -7,36 +7,10 @@ use ruma_identifiers::{EventId, RoomId, UserId}; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| 
 | ||||
| use super::{EncryptedFile, ImageInfo, ThumbnailInfo}; | ||||
| use crate::{EventType, FromRaw, UnsignedData}; | ||||
| use crate::{FromRaw, UnsignedData}; | ||||
| 
 | ||||
| pub mod feedback; | ||||
| 
 | ||||
| /// A message sent to a room.
 | ||||
| #[derive(Clone, Debug, Serialize)] | ||||
| #[serde(rename = "m.room.message", tag = "type")] | ||||
| pub struct MessageEvent { | ||||
|     /// The event's content.
 | ||||
|     pub content: MessageEventContent, | ||||
| 
 | ||||
|     /// The unique identifier for the event.
 | ||||
|     pub event_id: EventId, | ||||
| 
 | ||||
|     /// Time on originating homeserver when this event was sent.
 | ||||
|     #[serde(with = "ruma_serde::time::ms_since_unix_epoch")] | ||||
|     pub origin_server_ts: SystemTime, | ||||
| 
 | ||||
|     /// The unique identifier for the room associated with this event.
 | ||||
|     #[serde(skip_serializing_if = "Option::is_none")] | ||||
|     pub room_id: Option<RoomId>, | ||||
| 
 | ||||
|     /// The unique identifier for the user who sent this event.
 | ||||
|     pub sender: UserId, | ||||
| 
 | ||||
|     /// Additional key-value pairs not signed by the homeserver.
 | ||||
|     #[serde(skip_serializing_if = "UnsignedData::is_empty")] | ||||
|     pub unsigned: UnsignedData, | ||||
| } | ||||
| 
 | ||||
| /// The payload for `MessageEvent`.
 | ||||
| #[derive(Clone, Debug, Serialize)] | ||||
| #[serde(tag = "msgtype")] | ||||
| @ -78,21 +52,6 @@ pub enum MessageEventContent { | ||||
|     Video(VideoMessageEventContent), | ||||
| } | ||||
| 
 | ||||
| impl FromRaw for MessageEvent { | ||||
|     type Raw = raw::MessageEvent; | ||||
| 
 | ||||
|     fn from_raw(raw: raw::MessageEvent) -> Self { | ||||
|         Self { | ||||
|             content: FromRaw::from_raw(raw.content), | ||||
|             event_id: raw.event_id, | ||||
|             origin_server_ts: raw.origin_server_ts, | ||||
|             room_id: raw.room_id, | ||||
|             sender: raw.sender, | ||||
|             unsigned: raw.unsigned, | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl FromRaw for MessageEventContent { | ||||
|     type Raw = raw::MessageEventContent; | ||||
| 
 | ||||
| @ -113,8 +72,6 @@ impl FromRaw for MessageEventContent { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl_room_event!(MessageEvent, MessageEventContent, EventType::RoomMessage); | ||||
| 
 | ||||
| pub(crate) mod raw { | ||||
|     use std::time::SystemTime; | ||||
| 
 | ||||
| @ -128,30 +85,6 @@ pub(crate) mod raw { | ||||
|     }; | ||||
|     use crate::UnsignedData; | ||||
| 
 | ||||
|     /// A message sent to a room.
 | ||||
|     #[derive(Clone, Debug, Deserialize)] | ||||
|     pub struct MessageEvent { | ||||
|         /// The event's content.
 | ||||
|         pub content: MessageEventContent, | ||||
| 
 | ||||
|         /// The unique identifier for the event.
 | ||||
|         pub event_id: EventId, | ||||
| 
 | ||||
|         /// Time on originating homeserver when this event was sent.
 | ||||
|         #[serde(with = "ruma_serde::time::ms_since_unix_epoch")] | ||||
|         pub origin_server_ts: SystemTime, | ||||
| 
 | ||||
|         /// The unique identifier for the room associated with this event.
 | ||||
|         pub room_id: Option<RoomId>, | ||||
| 
 | ||||
|         /// The unique identifier for the user who sent this event.
 | ||||
|         pub sender: UserId, | ||||
| 
 | ||||
|         /// Additional key-value pairs not signed by the homeserver.
 | ||||
|         #[serde(default)] | ||||
|         pub unsigned: UnsignedData, | ||||
|     } | ||||
| 
 | ||||
|     /// The payload for `MessageEvent`.
 | ||||
|     #[allow(clippy::large_enum_variant)] | ||||
|     #[derive(Clone, Debug, Deserialize)] | ||||
|  | ||||
| @ -5,40 +5,7 @@ use std::time::SystemTime; | ||||
| use ruma_identifiers::{EventId, RoomId, UserId}; | ||||
| use serde::{Deserialize, Serialize}; | ||||
| 
 | ||||
| use crate::{EventType, InvalidInput, TryFromRaw, UnsignedData}; | ||||
| 
 | ||||
| /// A human-friendly room name designed to be displayed to the end-user.
 | ||||
| #[derive(Clone, Debug, Serialize)] | ||||
| #[serde(rename = "m.room.name", tag = "type")] | ||||
| pub struct NameEvent { | ||||
|     /// The event's content.
 | ||||
|     pub content: NameEventContent, | ||||
| 
 | ||||
|     /// The unique identifier for the event.
 | ||||
|     pub event_id: EventId, | ||||
| 
 | ||||
|     /// Time on originating homeserver when this event was sent.
 | ||||
|     #[serde(with = "ruma_serde::time::ms_since_unix_epoch")] | ||||
|     pub origin_server_ts: SystemTime, | ||||
| 
 | ||||
|     /// The previous content for this state key, if any.
 | ||||
|     #[serde(skip_serializing_if = "Option::is_none")] | ||||
|     pub prev_content: Option<NameEventContent>, | ||||
| 
 | ||||
|     /// The unique identifier for the room associated with this event.
 | ||||
|     #[serde(skip_serializing_if = "Option::is_none")] | ||||
|     pub room_id: Option<RoomId>, | ||||
| 
 | ||||
|     /// The unique identifier for the user who sent this event.
 | ||||
|     pub sender: UserId, | ||||
| 
 | ||||
|     /// A key that determines which piece of room state the event represents.
 | ||||
|     pub state_key: String, | ||||
| 
 | ||||
|     /// Additional key-value pairs not signed by the homeserver.
 | ||||
|     #[serde(skip_serializing_if = "UnsignedData::is_empty")] | ||||
|     pub unsigned: UnsignedData, | ||||
| } | ||||
| use crate::{InvalidInput, TryFromRaw, UnsignedData}; | ||||
| 
 | ||||
| /// The payload for `NameEvent`.
 | ||||
| #[derive(Clone, Debug, Serialize)] | ||||
| @ -47,27 +14,6 @@ pub struct NameEventContent { | ||||
|     pub(crate) name: Option<String>, | ||||
| } | ||||
| 
 | ||||
| impl TryFromRaw for NameEvent { | ||||
|     type Raw = raw::NameEvent; | ||||
|     type Err = InvalidInput; | ||||
| 
 | ||||
|     fn try_from_raw(raw: Self::Raw) -> Result<Self, Self::Err> { | ||||
|         let content = TryFromRaw::try_from_raw(raw.content)?; | ||||
|         let prev_content = raw.prev_content.map(TryFromRaw::try_from_raw).transpose()?; | ||||
| 
 | ||||
|         Ok(NameEvent { | ||||
|             content, | ||||
|             event_id: raw.event_id, | ||||
|             origin_server_ts: raw.origin_server_ts, | ||||
|             prev_content, | ||||
|             room_id: raw.room_id, | ||||
|             sender: raw.sender, | ||||
|             state_key: raw.state_key, | ||||
|             unsigned: raw.unsigned, | ||||
|         }) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl TryFromRaw for NameEventContent { | ||||
|     type Raw = raw::NameEventContent; | ||||
| 
 | ||||
| @ -81,8 +27,6 @@ impl TryFromRaw for NameEventContent { | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl_state_event!(NameEvent, NameEventContent, EventType::RoomName); | ||||
| 
 | ||||
| impl NameEventContent { | ||||
|     /// Create a new `NameEventContent` with the given name.
 | ||||
|     ///
 | ||||
| @ -108,36 +52,6 @@ impl NameEventContent { | ||||
| pub(crate) mod raw { | ||||
|     use super::*; | ||||
| 
 | ||||
|     /// A human-friendly room name designed to be displayed to the end-user.
 | ||||
|     #[derive(Clone, Debug, Deserialize)] | ||||
|     pub struct NameEvent { | ||||
|         /// The event's content.
 | ||||
|         pub content: NameEventContent, | ||||
| 
 | ||||
|         /// The unique identifier for the event.
 | ||||
|         pub event_id: EventId, | ||||
| 
 | ||||
|         /// Time on originating homeserver when this event was sent.
 | ||||
|         #[serde(with = "ruma_serde::time::ms_since_unix_epoch")] | ||||
|         pub origin_server_ts: SystemTime, | ||||
| 
 | ||||
|         /// The previous content for this state key, if any.
 | ||||
|         pub prev_content: Option<NameEventContent>, | ||||
| 
 | ||||
|         /// The unique identifier for the room associated with this event.
 | ||||
|         pub room_id: Option<RoomId>, | ||||
| 
 | ||||
|         /// The unique identifier for the user who sent this event.
 | ||||
|         pub sender: UserId, | ||||
| 
 | ||||
|         /// A key that determines which piece of room state the event represents.
 | ||||
|         pub state_key: String, | ||||
| 
 | ||||
|         /// Additional key-value pairs not signed by the homeserver.
 | ||||
|         #[serde(default)] | ||||
|         pub unsigned: UnsignedData, | ||||
|     } | ||||
| 
 | ||||
|     /// The payload of a `NameEvent`.
 | ||||
|     #[derive(Clone, Debug, Deserialize)] | ||||
|     pub struct NameEventContent { | ||||
| @ -164,7 +78,7 @@ mod tests { | ||||
| 
 | ||||
|     use crate::{EventJson, UnsignedData}; | ||||
| 
 | ||||
|     use super::{NameEvent, NameEventContent}; | ||||
|     use super::NameEventContent; | ||||
| 
 | ||||
|     #[test] | ||||
|     fn serialization_with_optional_fields_as_none() { | ||||
|  | ||||
| @ -24,7 +24,7 @@ mod tests { | ||||
| 
 | ||||
|     use crate::{ | ||||
|         room::pinned_events::{PinnedEventsEvent, PinnedEventsEventContent}, | ||||
|         Event, EventJson, RoomEvent, StateEvent, UnsignedData, | ||||
|         EventJson, UnsignedData, | ||||
|     }; | ||||
| 
 | ||||
|     #[test] | ||||
| @ -52,14 +52,14 @@ mod tests { | ||||
|                 .deserialize() | ||||
|                 .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.state_key(), event.state_key()); | ||||
|         assert_eq!(parsed_event.origin_server_ts(), event.origin_server_ts()); | ||||
|         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.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]); | ||||
|         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]); | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user