Make all fields owned values and remove event traits.

This commit is contained in:
Jimmy Cuadra 2016-06-04 02:49:24 -07:00
parent 3a26c5ecc6
commit fd03a1e162
24 changed files with 249 additions and 812 deletions

View File

@ -1,44 +1,21 @@
//! Types for the *m.call.answer* event.
use core::{Event, EventType, RoomEvent};
use super::{SessionDescription, SessionDescriptionType};
use core::EventType;
use super::SessionDescription;
/// This event is sent by the callee when they wish to answer the call.
pub struct AnswerEvent<'a> {
content: AnswerEventContent<'a>,
pub struct AnswerEvent {
content: AnswerEventContent,
event_id: String,
event_type: EventType,
room_id: String,
user_id: String,
}
impl<'a> Event<'a, AnswerEventContent<'a>> for AnswerEvent<'a> {
fn content(&'a self) -> &'a AnswerEventContent {
&self.content
}
fn event_type(&self) -> EventType {
EventType::CallAnswer
}
}
impl<'a> RoomEvent<'a, AnswerEventContent<'a>> for AnswerEvent<'a> {
fn event_id(&'a self) -> &'a str {
&self.event_id
}
fn room_id(&'a self) -> &'a str {
&self.room_id
}
fn user_id(&'a self) -> &'a str {
&self.user_id
}
}
/// The payload of an `AnswerEvent`.
pub struct AnswerEventContent<'a> {
pub struct AnswerEventContent {
/// The VoIP session description.
answer: SessionDescription<'a>,
answer: SessionDescription,
/// The ID of the call this event relates to.
call_id: String,
/// The version of the VoIP specification this messages adheres to.

View File

@ -1,56 +1,33 @@
//! Types for the *m.call.candidates* event.
use core::{Event, EventType, RoomEvent};
use core::EventType;
/// This event is sent by callers after sending an invite and by the callee after answering.
/// Its purpose is to give the other party additional ICE candidates to try using to communicate.
pub struct CandidatesEvent<'a> {
content: CandidatesEventContent<'a>,
event_id: &'a str,
room_id: &'a str,
user_id: &'a str,
}
impl<'a> Event<'a, CandidatesEventContent<'a>> for CandidatesEvent<'a> {
fn content(&'a self) -> &'a CandidatesEventContent {
&self.content
}
fn event_type(&self) -> EventType {
EventType::CallCandidates
}
}
impl<'a> RoomEvent<'a, CandidatesEventContent<'a>> for CandidatesEvent<'a> {
fn event_id(&'a self) -> &'a str {
&self.event_id
}
fn room_id(&'a self) -> &'a str {
&self.room_id
}
fn user_id(&'a self) -> &'a str {
&self.user_id
}
pub struct CandidatesEvent {
content: CandidatesEventContent,
event_id: String,
event_type: EventType,
room_id: String,
user_id: String,
}
/// The payload of a `CandidatesEvent`.
pub struct CandidatesEventContent<'a> {
pub struct CandidatesEventContent {
/// The ID of the call this event relates to.
call_id: &'a str,
call_id: String,
/// A list of candidates.
candidates: &'a[Candidate<'a>],
candidates: Vec<Candidate>,
/// The version of the VoIP specification this messages adheres to.
version: u64,
}
/// An ICE (Interactive Connectivity Establishment) candidate.
pub struct Candidate<'a> {
pub struct Candidate {
/// The SDP "a" line of the candidate.
candidate: &'a str,
candidate: String,
/// The SDP media type this candidate is intended for.
sdp_mid: &'a str,
sdp_mid: String,
/// The index of the SDP "m" line this candidate is intended for.
sdp_m_line_index: u64,
}

View File

@ -1,44 +1,21 @@
//! Types for the *m.call.hangup* event.
use core::{Event, EventType, RoomEvent};
use core::EventType;
/// Sent by either party to signal their termination of the call. This can be sent either once the
/// call has has been established or before to abort the call.
pub struct HangupEvent<'a> {
content: HangupEventContent<'a>,
event_id: &'a str,
room_id: &'a str,
user_id: &'a str,
}
impl<'a> Event<'a, HangupEventContent<'a>> for HangupEvent<'a> {
fn content(&'a self) -> &'a HangupEventContent {
&self.content
}
fn event_type(&self) -> EventType {
EventType::CallHangup
}
}
impl<'a> RoomEvent<'a, HangupEventContent<'a>> for HangupEvent<'a> {
fn event_id(&'a self) -> &'a str {
&self.event_id
}
fn room_id(&'a self) -> &'a str {
&self.room_id
}
fn user_id(&'a self) -> &'a str {
&self.user_id
}
pub struct HangupEvent {
content: HangupEventContent,
event_id: String,
event_type: EventType,
room_id: String,
user_id: String,
}
/// The payload of a `HangupEvent`.
pub struct HangupEventContent<'a> {
pub struct HangupEventContent {
/// The ID of the call this event relates to.
call_id: &'a str,
call_id: String,
/// The version of the VoIP specification this messages adheres to.
version: u64,
}

View File

@ -1,50 +1,27 @@
//! Types for the *m.call.invite* event.
use core::{Event, EventType, RoomEvent};
use super::{SessionDescription, SessionDescriptionType};
use core::EventType;
use super::SessionDescription;
/// This event is sent by the caller when they wish to establish a call.
pub struct InviteEvent<'a> {
content: InviteEventContent<'a>,
event_id: &'a str,
room_id: &'a str,
user_id: &'a str,
}
impl<'a> Event<'a, InviteEventContent<'a>> for InviteEvent<'a> {
fn content(&'a self) -> &'a InviteEventContent {
&self.content
}
fn event_type(&self) -> EventType {
EventType::CallInvite
}
}
impl<'a> RoomEvent<'a, InviteEventContent<'a>> for InviteEvent<'a> {
fn event_id(&'a self) -> &'a str {
&self.event_id
}
fn room_id(&'a self) -> &'a str {
&self.room_id
}
fn user_id(&'a self) -> &'a str {
&self.user_id
}
pub struct InviteEvent {
content: InviteEventContent,
event_id: String,
event_type: EventType,
room_id: String,
user_id: String,
}
/// The payload of an `InviteEvent`.
pub struct InviteEventContent<'a> {
pub struct InviteEventContent {
/// A unique identifer for the call.
call_id: &'a str,
call_id: String,
/// The time in milliseconds that the invite is valid for. Once the invite age exceeds this
/// value, clients should discard it. They should also no longer show the call as awaiting an
/// answer in the UI.
lifetime: u64,
/// The session description object.
offer: SessionDescription<'a>,
offer: SessionDescription,
/// The version of the VoIP specification this messages adheres to.
version: u64,
}

View File

@ -8,11 +8,11 @@ pub mod hangup;
pub mod invite;
/// A VoIP session description.
pub struct SessionDescription<'a> {
pub struct SessionDescription {
/// The type of session description.
session_type: SessionDescriptionType,
/// The SDP text of the session description.
sdp: &'a str,
sdp: String,
}
/// The type of VoIP session description.

View File

@ -1,5 +1,10 @@
//! Types for the basic kinds of events.
use room::avatar::AvatarEventContent;
use room::canonical_alias::CanonicalAliasEventContent;
use room::join_rules::JoinRulesEventContent;
use room::name::NameEventContent;
/// The type of an event.
pub enum EventType {
CallAnswer,
@ -27,48 +32,22 @@ pub enum EventType {
Typing,
}
/// Functionality common to all events.
pub trait Event<'a, T> {
/// The primary event payload.
fn content(&'a self) -> &'a T;
/// The type of event.
fn event_type(&self) -> EventType;
}
/// An event emitted within the context of a room.
pub trait RoomEvent<'a, T>: Event<'a, T> {
/// The globally unique event identifier.
fn event_id(&'a self) -> &'a str;
/// The ID of the room associated with this event.
fn room_id(&'a self) -> &'a str;
/// The fully-qualified ID of the user who sent the event.
fn user_id(&'a self) -> &'a str;
}
/// An event that represents some aspect of a room's state.
pub trait StateEvent<'a, 'b, T>: RoomEvent<'a, T> {
/// Previous content for this aspect of room state.
fn prev_content(&'a self) -> Option<&'b T> {
None
}
/// A unique key which defines the overwriting semantics for this aspect of room state.
fn state_key(&self) -> &'a str {
""
}
}
/// A stripped-down version of a state event that is included along with some other events.
pub struct StrippedState<'a, T: 'a> {
content: &'a T,
state_key: &'a str,
event_type: StrippedStateType,
pub enum StrippedState {
RoomAvatar(StrippedRoomAvatar),
RoomCanonicalAlias(StrippedRoomCanonicalAlias),
RoomJoinRules(StrippedRoomJoinRules),
RoomName(StrippedRoomName),
}
/// The type of event in a `StrippedState`.
pub enum StrippedStateType {
RoomAvatar,
RoomCanonicalAlias,
RoomJoinRules,
RoomName,
/// The general form of a `StrippedState`.
pub struct StrippedStateContent<T> {
content: T,
event_type: EventType,
state_key: String,
}
pub type StrippedRoomAvatar = StrippedStateContent<AvatarEventContent>;
pub type StrippedRoomCanonicalAlias = StrippedStateContent<CanonicalAliasEventContent>;
pub type StrippedRoomJoinRules = StrippedStateContent<JoinRulesEventContent>;
pub type StrippedRoomName = StrippedStateContent<NameEventContent>;

View File

@ -1,29 +1,20 @@
//! Types for the *m.presence* event.
use core::{Event, EventType};
use core::EventType;
/// Informs the client of a user's presence state change.
pub struct PresenceEvent<'a> {
content: PresenceEventContent<'a>,
event_id: &'a str,
}
impl<'a> Event<'a, PresenceEventContent<'a>> for PresenceEvent<'a> {
fn content(&'a self) -> &'a PresenceEventContent {
&self.content
}
fn event_type(&self) -> EventType {
EventType::Presence
}
pub struct PresenceEvent {
content: PresenceEventContent,
event_id: String,
event_type: EventType,
}
/// The payload of a `PresenceEvent`.
pub struct PresenceEventContent<'a> {
pub struct PresenceEventContent {
/// The current avatar URL for this user.
avatar_url: Option<&'a str>,
avatar_url: Option<String>,
/// The current display name for this user.
displayname: Option<&'a str>,
displayname: Option<String>,
/// The last time since this used performed some action, in milliseconds.
last_active_ago: Option<u64>,
/// The presence state for this user.

View File

@ -2,40 +2,31 @@
use std::collections::HashMap;
use core::{Event, EventType};
use core::EventType;
/// Informs the client of new receipts.
pub struct ReceiptEvent<'a> {
content: ReceiptEventContent<'a>,
room_id: &'a str,
}
impl<'a> Event<'a, ReceiptEventContent<'a>> for ReceiptEvent<'a> {
fn content(&'a self) -> &'a ReceiptEventContent {
&self.content
}
fn event_type(&self) -> EventType {
EventType::Receipt
}
pub struct ReceiptEvent {
content: ReceiptEventContent,
event_type: EventType,
room_id: String,
}
/// The payload of a `ReceiptEvent`.
///
/// A mapping of event ID to a collection of receipts for this event ID. The event ID is the ID of
/// the event being acknowledged and *not* an ID for the receipt itself.
pub type ReceiptEventContent<'a> = HashMap<&'a str, Receipts<'a>>;
pub type ReceiptEventContent = HashMap<String, Receipts>;
/// A collection of receipts.
pub struct Receipts<'a> {
pub struct Receipts {
/// A collection of users who have sent *m.read* receipts for this event.
m_read: UserReceipts<'a>,
m_read: UserReceipts,
}
/// A mapping of user ID to receipt.
///
/// The user ID is the entity who sent this receipt.
pub type UserReceipts<'a> = HashMap<&'a str, Receipt>;
pub type UserReceipts = HashMap<String, Receipt>;
/// An acknowledgement of an event.
pub struct Receipt {

View File

@ -1,57 +1,21 @@
//! Types for the *m.room.aliases* event.
use core::{Event, EventType, RoomEvent, StateEvent};
use core::EventType;
/// Informs the room about what room aliases it has been given.
pub struct AliasesEvent<'a, 'b> {
content: AliasesEventContent<'a>,
event_id: &'a str,
prev_content: Option<AliasesEventContent<'b>>,
room_id: &'a str,
pub struct AliasesEvent {
content: AliasesEventContent,
event_id: String,
event_type: EventType,
prev_content: Option<AliasesEventContent>,
room_id: String,
/// The homeserver domain which owns these room aliases.
state_key: &'a str,
user_id: &'a str,
}
impl<'a, 'b> Event<'a, AliasesEventContent<'a>> for AliasesEvent<'a, 'b> {
fn content(&'a self) -> &'a AliasesEventContent<'a> {
&self.content
}
fn event_type(&self) -> EventType {
EventType::RoomAliases
}
}
impl<'a, 'b> RoomEvent<'a, AliasesEventContent<'a>> for AliasesEvent<'a, 'b> {
fn event_id(&'a self) -> &'a str {
&self.event_id
}
fn room_id(&'a self) -> &'a str {
&self.room_id
}
fn user_id(&'a self) -> &'a str {
&self.user_id
}
}
impl<'a, 'b> StateEvent<'a, 'b, AliasesEventContent<'a>> for AliasesEvent<'a, 'b> {
fn prev_content(&'a self) -> Option<&'b AliasesEventContent> {
match self.prev_content {
Some(ref prev_content) => Some(prev_content),
None => None,
}
}
fn state_key(&self) -> &'a str {
&self.state_key
}
state_key: String,
user_id: String,
}
/// The payload of an `AliasesEvent`.
pub struct AliasesEventContent<'a> {
pub struct AliasesEventContent {
/// A list of room aliases.
aliases: &'a[&'a str],
aliases: Vec<String>,
}

View File

@ -1,59 +1,25 @@
//! Types for the *m.room.avatar* event.
use core::{Event, EventType, RoomEvent, StateEvent};
use core::EventType;
use super::ImageInfo;
/// A picture that is associated with the room.
///
/// This can be displayed alongside the room information.
pub struct AvatarEvent<'a, 'b> {
content: AvatarEventContent<'a>,
event_id: &'a str,
prev_content: Option<AvatarEventContent<'b>>,
room_id: &'a str,
user_id: &'a str,
pub struct AvatarEvent {
content: AvatarEventContent,
event_id: String,
event_type: EventType,
prev_content: Option<AvatarEventContent>,
room_id: String,
state_key: String,
user_id: String,
}
impl<'a, 'b> Event<'a, AvatarEventContent<'a>> for AvatarEvent<'a, 'b> {
fn content(&'a self) -> &'a AvatarEventContent<'a> {
&self.content
}
fn event_type(&self) -> EventType {
EventType::RoomAvatar
}
}
impl<'a, 'b> RoomEvent<'a, AvatarEventContent<'a>> for AvatarEvent<'a, 'b> {
fn event_id(&'a self) -> &'a str {
&self.event_id
}
fn room_id(&'a self) -> &'a str {
&self.room_id
}
fn user_id(&'a self) -> &'a str {
&self.user_id
}
}
impl<'a, 'b> StateEvent<'a, 'b, AvatarEventContent<'a>> for AvatarEvent<'a, 'b> {
fn prev_content(&'a self) -> Option<&'b AvatarEventContent> {
match self.prev_content {
Some(ref prev_content) => Some(prev_content),
None => None,
}
}
fn state_key(&self) -> &'a str {
""
}
}
/// The payload of an `AvatarEvent`.
pub struct AvatarEventContent<'a> {
info: &'a ImageInfo<'a>,
thumbnail_info: &'a ImageInfo<'a>,
thumbnail_url: &'a str,
url: &'a str,
pub struct AvatarEventContent {
info: ImageInfo,
thumbnail_info: ImageInfo,
thumbnail_url: String,
url: String,
}

View File

@ -1,52 +1,20 @@
//! Types for the *m.room.canonical_alias* event.
use core::{Event, EventType, RoomEvent, StateEvent};
use core::EventType;
/// Informs the room as to which alias is the canonical one.
pub struct CanonicalAliasEvent<'a, 'b> {
content: CanonicalAliasEventContent<'a>,
event_id: &'a str,
prev_content: Option<CanonicalAliasEventContent<'b>>,
room_id: &'a str,
user_id: &'a str,
}
impl<'a, 'b> Event<'a, CanonicalAliasEventContent<'a>> for CanonicalAliasEvent<'a, 'b> {
fn content(&'a self) -> &'a CanonicalAliasEventContent<'a> {
&self.content
}
fn event_type(&self) -> EventType {
EventType::RoomCanonicalAlias
}
}
impl<'a, 'b> RoomEvent<'a, CanonicalAliasEventContent<'a>> for CanonicalAliasEvent<'a, 'b> {
fn event_id(&'a self) -> &'a str {
&self.event_id
}
fn room_id(&'a self) -> &'a str {
&self.room_id
}
fn user_id(&'a self) -> &'a str {
&self.user_id
}
}
impl<'a, 'b> StateEvent<'a, 'b, CanonicalAliasEventContent<'a>> for CanonicalAliasEvent<'a, 'b> {
fn prev_content(&'a self) -> Option<&'b CanonicalAliasEventContent> {
match self.prev_content {
Some(ref prev_content) => Some(prev_content),
None => None,
}
}
pub struct CanonicalAliasEvent {
content: CanonicalAliasEventContent,
event_id: String,
event_type: EventType,
prev_content: Option<CanonicalAliasEventContent>,
room_id: String,
state_key: String,
user_id: String,
}
/// The payload of a `CanonicalAliasEvent`.
pub struct CanonicalAliasEventContent<'a> {
pub struct CanonicalAliasEventContent {
/// The canonical alias.
alias: &'a str,
alias: String,
}

View File

@ -1,46 +1,21 @@
//! Types for the *m.room.create* event.
use core::{Event, EventType, RoomEvent, StateEvent};
use core::EventType;
/// This is the first event in a room and cannot be changed. It acts as the root of all other
/// events.
pub struct CreateEvent<'a, 'b> {
content: CreateEventContent<'a>,
event_id: &'a str,
prev_content: Option<CreateEventContent<'b>>,
room_id: &'a str,
user_id: &'a str,
pub struct CreateEvent {
content: CreateEventContent,
event_id: String,
event_type: EventType,
prev_content: Option<CreateEventContent>,
room_id: String,
state_key: String,
user_id: String,
}
impl<'a, 'b> Event<'a, CreateEventContent<'a>> for CreateEvent<'a, 'b> {
fn content(&'a self) -> &'a CreateEventContent<'a> {
&self.content
}
fn event_type(&self) -> EventType {
EventType::RoomCreate
}
}
impl<'a, 'b> RoomEvent<'a, CreateEventContent<'a>> for CreateEvent<'a, 'b> {
fn event_id(&'a self) -> &'a str {
&self.event_id
}
fn room_id(&'a self) -> &'a str {
&self.room_id
}
fn user_id(&'a self) -> &'a str {
&self.user_id
}
}
impl<'a, 'b> StateEvent<'a, 'b, CreateEventContent<'a>> for CreateEvent<'a, 'b> {}
/// The payload of a `CreateEvent`.
pub struct CreateEventContent<'a> {
pub struct CreateEventContent {
/// The `user_id` of the room creator. This is set by the homeserver.
creator: &'a str,
creator: String,
}

View File

@ -1,59 +1,24 @@
//! Types for the *m.room.guest_access* event.
use core::{Event, EventType, RoomEvent, StateEvent};
use core::EventType;
/// Controls whether guest users are allowed to join rooms.
///
/// This event controls whether guest users are allowed to join rooms. If this event is absent,
/// servers should act as if it is present and has the value `GuestAccess::Forbidden`.
pub struct GuestAccessEvent<'a, 'b> {
content: GuestAccessEventContent<'a>,
event_id: &'a str,
prev_content: Option<GuestAccessEventContent<'b>>,
room_id: &'a str,
user_id: &'a str,
}
impl<'a, 'b> Event<'a, GuestAccessEventContent<'a>> for GuestAccessEvent<'a, 'b> {
fn content(&'a self) -> &'a GuestAccessEventContent<'a> {
&self.content
}
fn event_type(&self) -> EventType {
EventType::RoomGuestAccess
}
}
impl<'a, 'b> RoomEvent<'a, GuestAccessEventContent<'a>> for GuestAccessEvent<'a, 'b> {
fn event_id(&'a self) -> &'a str {
&self.event_id
}
fn room_id(&'a self) -> &'a str {
&self.room_id
}
fn user_id(&'a self) -> &'a str {
&self.user_id
}
}
impl<'a, 'b> StateEvent<'a, 'b, GuestAccessEventContent<'a>> for GuestAccessEvent<'a, 'b> {
fn prev_content(&'a self) -> Option<&'b GuestAccessEventContent> {
match self.prev_content {
Some(ref prev_content) => Some(prev_content),
None => None,
}
}
fn state_key(&self) -> &'a str {
""
}
pub struct GuestAccessEvent {
content: GuestAccessEventContent,
event_id: String,
event_type: EventType,
prev_content: Option<GuestAccessEventContent>,
room_id: String,
state_key: String,
user_id: String,
}
/// The payload of a `GuestAccessEvent`.
pub struct GuestAccessEventContent<'a> {
guest_access: &'a GuestAccess,
pub struct GuestAccessEventContent {
guest_access: GuestAccess,
}
/// A policy for guest user access to a room.

View File

@ -1,56 +1,23 @@
//! Types for the *m.room.history_visibility* event.
use core::{Event, EventType, RoomEvent, StateEvent};
use core::EventType;
/// This event controls whether a member of a room can see the events that happened in a room from
/// before they joined.
pub struct HistoryVisibilityEvent<'a, 'b> {
content: HistoryVisibilityEventContent<'a>,
event_id: &'a str,
prev_content: Option<HistoryVisibilityEventContent<'b>>,
room_id: &'a str,
user_id: &'a str,
}
impl<'a, 'b> Event<'a, HistoryVisibilityEventContent<'a>> for HistoryVisibilityEvent<'a, 'b> {
fn content(&'a self) -> &'a HistoryVisibilityEventContent<'a> {
&self.content
}
fn event_type(&self) -> EventType {
EventType::RoomHistoryVisibility
}
}
impl<'a, 'b> RoomEvent<'a, HistoryVisibilityEventContent<'a>> for HistoryVisibilityEvent<'a, 'b> {
fn event_id(&'a self) -> &'a str {
&self.event_id
}
fn room_id(&'a self) -> &'a str {
&self.room_id
}
fn user_id(&'a self) -> &'a str {
&self.user_id
}
}
impl<'a, 'b> StateEvent<'a, 'b, HistoryVisibilityEventContent<'a>>
for HistoryVisibilityEvent<'a, 'b>
{
fn prev_content(&'a self) -> Option<&'b HistoryVisibilityEventContent> {
match self.prev_content {
Some(ref prev_content) => Some(prev_content),
None => None,
}
}
pub struct HistoryVisibilityEvent {
content: HistoryVisibilityEventContent,
event_id: String,
event_type: EventType,
prev_content: Option<HistoryVisibilityEventContent>,
room_id: String,
state_key: String,
user_id: String,
}
/// The payload of a `HistoryVisibilityEvent`.
pub struct HistoryVisibilityEventContent<'a> {
pub struct HistoryVisibilityEventContent {
/// Who can see the room history.
history_visibility: &'a HistoryVisibility,
history_visibility: HistoryVisibility,
}
/// Who can see a room's history.
@ -70,4 +37,3 @@ pub enum HistoryVisibility {
/// participating homeserver with anyone, regardless of whether they have ever joined the room.
WorldReadable,
}

View File

@ -1,57 +1,26 @@
//! Types for the *m.room.join_rules* event.
use core::{Event, EventType, RoomEvent, StateEvent};
use core::EventType;
/// Describes how users are allowed to join the room.
pub struct JoinRulesEvent<'a, 'b> {
content: JoinRulesEventContent<'a>,
event_id: &'a str,
prev_content: Option<JoinRulesEventContent<'b>>,
room_id: &'a str,
user_id: &'a str,
}
impl<'a, 'b> Event<'a, JoinRulesEventContent<'a>> for JoinRulesEvent<'a, 'b> {
fn content(&'a self) -> &'a JoinRulesEventContent<'a> {
&self.content
}
fn event_type(&self) -> EventType {
EventType::RoomJoinRules
}
}
impl<'a, 'b> RoomEvent<'a, JoinRulesEventContent<'a>> for JoinRulesEvent<'a, 'b> {
fn event_id(&'a self) -> &'a str {
&self.event_id
}
fn room_id(&'a self) -> &'a str {
&self.room_id
}
fn user_id(&'a self) -> &'a str {
&self.user_id
}
}
impl<'a, 'b> StateEvent<'a, 'b, JoinRulesEventContent<'a>> for JoinRulesEvent<'a, 'b> {
fn prev_content(&'a self) -> Option<&'b JoinRulesEventContent> {
match self.prev_content {
Some(ref prev_content) => Some(prev_content),
None => None,
}
}
pub struct JoinRulesEvent {
content: JoinRulesEventContent,
event_id: String,
event_type: EventType,
prev_content: Option<JoinRulesEventContent>,
room_id: String,
state_key: String,
user_id: String,
}
/// The payload of a `JoinRulesEvent`.
pub struct JoinRulesEventContent<'a> {
pub struct JoinRulesEventContent {
/// The type of rules used for users wishing to join this room.
join_rule: &'a JoinRules,
join_rule: JoinRule,
}
/// The rule used for users wishing to join this room.
pub enum JoinRules {
pub enum JoinRule {
/// A user who wishes to join the room must first receive an invite to the room from someone
/// already inside of the room.
Invite,

View File

@ -2,7 +2,7 @@
use std::collections::HashMap;
use core::{Event, EventType, RoomEvent, StateEvent, StrippedState, StrippedStateType};
use core::{EventType, StrippedState};
/// The current membership state of a user in the room.
///
@ -17,57 +17,21 @@ use core::{Event, EventType, RoomEvent, StateEvent, StrippedState, StrippedState
/// This event may also include an *invite_room_state* key outside the *content* key. If present,
/// this contains an array of `StrippedState` events. These events provide information on a few
/// select state events such as the room name.
pub struct MemberEvent<'a, 'b, T: 'a> {
content: MemberEventContent<'a>,
event_id: &'a str,
invite_room_state: Option<&'a[&'a StrippedState<'a, T>]>,
prev_content: Option<MemberEventContent<'b>>,
room_id: &'a str,
state_key: &'a str,
user_id: &'a str,
}
impl<'a, 'b, T> Event<'a, MemberEventContent<'a>> for MemberEvent<'a, 'b, T> {
fn content(&'a self) -> &'a MemberEventContent<'a> {
&self.content
}
fn event_type(&self) -> EventType {
EventType::RoomMember
}
}
impl<'a, 'b, T> RoomEvent<'a, MemberEventContent<'a>> for MemberEvent<'a, 'b, T> {
fn event_id(&'a self) -> &'a str {
&self.event_id
}
fn room_id(&'a self) -> &'a str {
&self.room_id
}
fn user_id(&'a self) -> &'a str {
&self.user_id
}
}
impl<'a, 'b, T> StateEvent<'a, 'b, MemberEventContent<'a>> for MemberEvent<'a, 'b, T> {
fn prev_content(&'a self) -> Option<&'b MemberEventContent> {
match self.prev_content {
Some(ref prev_content) => Some(prev_content),
None => None,
}
}
fn state_key(&self) -> &'a str {
&self.state_key
}
pub struct MemberEvent {
content: MemberEventContent,
event_id: String,
event_type: EventType,
invite_room_state: Option<Vec<StrippedState>>,
prev_content: Option<MemberEventContent>,
room_id: String,
state_key: String,
user_id: String,
}
/// The payload of a `MemberEvent`.
pub struct MemberEventContent<'a> {
avatar_url: Option<&'a str>,
displayname: Option<&'a str>,
pub struct MemberEventContent {
avatar_url: Option<String>,
displayname: Option<String>,
membership: MembershipState,
third_party_invite: (), // TODO
}

View File

@ -18,9 +18,9 @@ pub mod third_party_invite;
pub mod topic;
/// Metadata about an image.
pub struct ImageInfo<'a> {
pub struct ImageInfo {
height: u64,
mimetype: &'a str,
mimetype: String,
size: u64,
width: u64,
}

View File

@ -1,51 +1,20 @@
//! Types for the *m.room.name* event.
use core::{Event, EventType, RoomEvent, StateEvent};
use core::EventType;
/// A human-friendly room name designed to be displayed to the end-user.
pub struct NameEvent<'a, 'b> {
content: NameEventContent<'a>,
event_id: &'a str,
prev_content: Option<NameEventContent<'b>>,
room_id: &'a str,
user_id: &'a str,
}
impl<'a, 'b> Event<'a, NameEventContent<'a>> for NameEvent<'a, 'b> {
fn content(&'a self) -> &'a NameEventContent<'a> {
&self.content
}
fn event_type(&self) -> EventType {
EventType::RoomName
}
}
impl<'a, 'b> RoomEvent<'a, NameEventContent<'a>> for NameEvent<'a, 'b> {
fn event_id(&'a self) -> &'a str {
&self.event_id
}
fn room_id(&'a self) -> &'a str {
&self.room_id
}
fn user_id(&'a self) -> &'a str {
&self.user_id
}
}
impl<'a, 'b> StateEvent<'a, 'b, NameEventContent<'a>> for NameEvent<'a, 'b> {
fn prev_content(&'a self) -> Option<&'b NameEventContent> {
match self.prev_content {
Some(ref prev_content) => Some(prev_content),
None => None,
}
}
pub struct NameEvent {
content: NameEventContent,
event_id: String,
event_type: EventType,
prev_content: Option<NameEventContent>,
room_id: String,
state_key: String,
user_id: String,
}
/// The payload of a `NameEvent`.
pub struct NameEventContent<'a> {
pub struct NameEventContent {
/// The name of the room. This MUST NOT exceed 255 bytes.
name: &'a str,
name: String,
}

View File

@ -2,58 +2,27 @@
use std::collections::HashMap;
use core::{Event, EventType, RoomEvent, StateEvent};
use core::EventType;
/// Defines the power levels (privileges) of users in the room.
pub struct PowerLevelsEvent<'a, 'b> {
content: PowerLevelsEventContent<'a>,
event_id: &'a str,
prev_content: Option<PowerLevelsEventContent<'b>>,
room_id: &'a str,
user_id: &'a str,
}
impl<'a, 'b> Event<'a, PowerLevelsEventContent<'a>> for PowerLevelsEvent<'a, 'b> {
fn content(&'a self) -> &'a PowerLevelsEventContent<'a> {
&self.content
}
fn event_type(&self) -> EventType {
EventType::RoomPowerLevels
}
}
impl<'a, 'b> RoomEvent<'a, PowerLevelsEventContent<'a>> for PowerLevelsEvent<'a, 'b> {
fn event_id(&'a self) -> &'a str {
&self.event_id
}
fn room_id(&'a self) -> &'a str {
&self.room_id
}
fn user_id(&'a self) -> &'a str {
&self.user_id
}
}
impl<'a, 'b> StateEvent<'a, 'b, PowerLevelsEventContent<'a>> for PowerLevelsEvent<'a, 'b> {
fn prev_content(&'a self) -> Option<&'b PowerLevelsEventContent> {
match self.prev_content {
Some(ref prev_content) => Some(prev_content),
None => None,
}
}
pub struct PowerLevelsEvent {
content: PowerLevelsEventContent,
event_id: String,
event_type: EventType,
prev_content: Option<PowerLevelsEventContent>,
room_id: String,
state_key: String,
user_id: String,
}
/// The payload of a `PowerLevelsEvent`.
pub struct PowerLevelsEventContent<'a> {
pub struct PowerLevelsEventContent {
ban: u64,
events: &'a HashMap<&'a str, u64>,
events: HashMap<String, u64>,
events_default: u64,
kick: u64,
redact: u64,
state_default: u64,
users: &'a HashMap<&'a str, u64>,
users: HashMap<String, u64>,
users_default: u64,
}

View File

@ -1,43 +1,20 @@
//! Types for the *m.room.avatar* event.
use core::{Event, EventType, RoomEvent};
use core::EventType;
/// A redaction of an event.
pub struct RedactionEvent<'a> {
content: RedactionEventContent<'a>,
event_id: &'a str,
pub struct RedactionEvent {
content: RedactionEventContent,
event_id: String,
event_type: EventType,
/// The ID of the event that was redacted.
redacts: &'a str,
room_id: &'a str,
user_id: &'a str,
}
impl<'a, 'b> Event<'a, RedactionEventContent<'a>> for RedactionEvent<'a> {
fn content(&'a self) -> &'a RedactionEventContent<'a> {
&self.content
}
fn event_type(&self) -> EventType {
EventType::RoomRedaction
}
}
impl<'a> RoomEvent<'a, RedactionEventContent<'a>> for RedactionEvent<'a> {
fn event_id(&'a self) -> &'a str {
&self.event_id
}
fn room_id(&'a self) -> &'a str {
&self.room_id
}
fn user_id(&'a self) -> &'a str {
&self.user_id
}
redacts: String,
room_id: String,
user_id: String,
}
/// The payload of a `RedactionEvent`.
pub struct RedactionEventContent<'a> {
pub struct RedactionEventContent {
/// The reason for the redaction, if any.
reason: Option<&'a str>,
reason: Option<String>,
}

View File

@ -1,61 +1,25 @@
//! Types for the *m.room.third_party_invite* event.
use core::{Event, EventType, RoomEvent, StateEvent};
use core::EventType;
/// An invitation to a room issued to a third party identifier, rather than a matrix user ID.
///
/// Acts as an *m.room.member* invite event, where there isn't a target user_id to invite. This
/// event contains a token and a public key whose private key must be used to sign the token. Any
/// user who can present that signature may use this invitation to join the target room.
pub struct ThirdPartyInviteEvent<'a, 'b> {
content: ThirdPartyInviteEventContent<'a>,
event_id: &'a str,
prev_content: Option<ThirdPartyInviteEventContent<'b>>,
room_id: &'a str,
state_key: &'a str,
user_id: &'a str,
}
impl<'a, 'b> Event<'a, ThirdPartyInviteEventContent<'a>> for ThirdPartyInviteEvent<'a, 'b> {
fn content(&'a self) -> &'a ThirdPartyInviteEventContent<'a> {
&self.content
}
fn event_type(&self) -> EventType {
EventType::RoomThirdPartyInvite
}
}
impl<'a, 'b> RoomEvent<'a, ThirdPartyInviteEventContent<'a>> for ThirdPartyInviteEvent<'a, 'b> {
fn event_id(&'a self) -> &'a str {
&self.event_id
}
fn room_id(&'a self) -> &'a str {
&self.room_id
}
fn user_id(&'a self) -> &'a str {
&self.user_id
}
}
impl<'a, 'b> StateEvent<'a, 'b, ThirdPartyInviteEventContent<'a>> for ThirdPartyInviteEvent<'a, 'b> {
fn prev_content(&'a self) -> Option<&'b ThirdPartyInviteEventContent> {
match self.prev_content {
Some(ref prev_content) => Some(prev_content),
None => None,
}
}
fn state_key(&self) -> &'a str {
&self.state_key
}
pub struct ThirdPartyInviteEvent {
content: ThirdPartyInviteEventContent,
event_id: String,
event_type: EventType,
prev_content: Option<ThirdPartyInviteEventContent>,
room_id: String,
state_key: String,
user_id: String,
}
/// The payload of a `ThirdPartyInviteEvent`.
pub struct ThirdPartyInviteEventContent<'a> {
display_name: &'a str,
key_validity_url: &'a str,
public_key: &'a str,
pub struct ThirdPartyInviteEventContent {
display_name: String,
key_validity_url: String,
public_key: String,
}

View File

@ -1,51 +1,20 @@
//! Types for the *m.room.topic* event.
use core::{Event, EventType, RoomEvent, StateEvent};
use core::EventType;
/// A topic is a short message detailing what is currently being discussed in the room.
pub struct TopicEvent<'a, 'b> {
content: TopicEventContent<'a>,
event_id: &'a str,
prev_content: Option<TopicEventContent<'b>>,
room_id: &'a str,
user_id: &'a str,
}
impl<'a, 'b> Event<'a, TopicEventContent<'a>> for TopicEvent<'a, 'b> {
fn content(&'a self) -> &'a TopicEventContent<'a> {
&self.content
}
fn event_type(&self) -> EventType {
EventType::RoomTopic
}
}
impl<'a, 'b> RoomEvent<'a, TopicEventContent<'a>> for TopicEvent<'a, 'b> {
fn event_id(&'a self) -> &'a str {
&self.event_id
}
fn room_id(&'a self) -> &'a str {
&self.room_id
}
fn user_id(&'a self) -> &'a str {
&self.user_id
}
}
impl<'a, 'b> StateEvent<'a, 'b, TopicEventContent<'a>> for TopicEvent<'a, 'b> {
fn prev_content(&'a self) -> Option<&'b TopicEventContent> {
match self.prev_content {
Some(ref prev_content) => Some(prev_content),
None => None,
}
}
pub struct TopicEvent {
content: TopicEventContent,
event_id: String,
event_type: EventType,
prev_content: Option<TopicEventContent>,
room_id: String,
state_key: String,
user_id: String,
}
/// The payload of a `TopicEvent`.
pub struct TopicEventContent<'a> {
pub struct TopicEventContent {
/// The topic text.
topic: &'a str,
topic: String,
}

View File

@ -2,29 +2,21 @@
use std::collections::HashMap;
use core::{Event, EventType};
use core::EventType;
/// Informs the client of tags on a room.
pub struct TagEvent<'a> {
pub struct TagEvent {
/// The payload.
content: TagEventContent<'a>,
}
impl<'a> Event<'a, TagEventContent<'a>> for TagEvent<'a> {
fn content(&'a self) -> &'a TagEventContent<'a> {
&self.content
}
fn event_type(&self) -> EventType {
EventType::Tag
}
content: TagEventContent,
}
/// The payload of a `TagEvent`.
pub struct TagEventContent<'a> {
/// The list of user IDs typing in this room, if any.
tags: &'a Tags<'a>,
pub struct TagEventContent {
/// A map of tag names to tag info.
tags: HashMap<String, TagInfo>,
}
/// A map of tag names to values.
pub type Tags<'a> = HashMap<&'a str, &'a str>;
/// Information about a tag.
pub struct TagInfo {
order: Option<u64>,
}

View File

@ -1,27 +1,18 @@
//! Types for the *m.typing* event.
use core::{Event, EventType};
use core::EventType;
/// Informs the client of the list of users currently typing.
pub struct TypingEvent<'a> {
pub struct TypingEvent {
/// The payload.
content: TypingEventContent<'a>,
content: TypingEventContent,
event_type: EventType,
/// The ID of the room associated with this event.
room_id: &'a str,
}
impl<'a> Event<'a, TypingEventContent<'a>> for TypingEvent<'a> {
fn content(&'a self) -> &'a TypingEventContent<'a> {
&self.content
}
fn event_type(&self) -> EventType {
EventType::Typing
}
room_id: String,
}
/// The payload of a `TypingEvent`.
pub struct TypingEventContent<'a> {
pub struct TypingEventContent {
/// The list of user IDs typing in this room, if any.
user_ids: &'a[&'a str],
user_ids: Vec<String>,
}