Replace r0::room::create_room::InitialStateEvent with ruma_events::InitialStateEvent

This commit is contained in:
Jonas Platte 2020-08-17 23:36:00 +02:00
parent 6006e0b52e
commit 578f6c8925
No known key found for this signature in database
GPG Key ID: CC154DE0E30B7C67
6 changed files with 80 additions and 53 deletions

View File

@ -56,6 +56,7 @@ Breaking changes:
`r0::room::membership::ThirdPartySigned`.
* Move `r0::directory::{Filter, PublicRoomsChunk, RoomNetwork}` to
the `ruma-common` crate
* Replace `r0::room::create_room::InitialStateEvent` with `ruma_events::InitialStateEvent`
Improvements:

View File

@ -8,11 +8,10 @@ use ruma_events::{
create::{CreateEventContent, PreviousRoom},
power_levels::PowerLevelsEventContent,
},
EventType,
AnyInitialStateEvent,
};
use ruma_identifiers::{RoomId, RoomVersionId, UserId};
use serde::{Deserialize, Serialize};
use serde_json::value::RawValue as RawJsonValue;
use super::Visibility;
use crate::r0::membership::Invite3pid;
@ -38,7 +37,7 @@ ruma_api! {
/// Takes precedence over events set by preset, but gets overriden by
/// name and topic keys.
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub initial_state: Vec<InitialStateEvent>,
pub initial_state: Vec<AnyInitialStateEvent>,
/// A list of user IDs to invite to the room.
///
@ -168,20 +167,3 @@ pub enum RoomPreset {
/// Same as `PrivateChat`, but all initial invitees get the same power level as the creator.
TrustedPrivateChat,
}
/// Represents content of a state event to be used to initalize new room state.
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct InitialStateEvent {
/// State event type.
// FIXME: This should really only be a subset of the EventType enum.
#[serde(rename = "type")]
pub event_type: EventType,
/// `state_key` of the event to be sent.
pub state_key: Option<String>,
/// JSON content of the state event.
///
/// To create a `Box<RawJsonValue>`, use `serde_json::value::to_raw_value`.
pub content: Box<RawJsonValue>,
}

View File

@ -8,7 +8,13 @@ use crate::event_parse::{EventEnumInput, EventKind, EventKindVariation};
fn is_non_stripped_room_event(kind: &EventKind, var: &EventKindVariation) -> bool {
matches!(kind, EventKind::Message | EventKind::State)
&& !matches!(var, EventKindVariation::Stripped | EventKindVariation::RedactedStripped)
&& matches!(
var,
EventKindVariation::Full
| EventKindVariation::Sync
| EventKindVariation::Redacted
| EventKindVariation::RedactedSync
)
}
fn has_prev_content_field(kind: &EventKind, var: &EventKindVariation) -> bool {
@ -28,8 +34,9 @@ const EVENT_FIELDS: &[(&str, EventKindFn)] = &[
&& matches!(var, EventKindVariation::Full | EventKindVariation::Redacted)
}),
("event_id", is_non_stripped_room_event),
("sender", |kind, _| {
("sender", |kind, &var| {
matches!(kind, EventKind::Message | EventKind::State | EventKind::ToDevice)
&& var != EventKindVariation::Initial
}),
("state_key", |kind, _| matches!(kind, EventKind::State)),
("unsigned", is_non_stripped_room_event),
@ -71,6 +78,15 @@ pub fn expand_event_enum(input: EventEnumInput) -> syn::Result<TokenStream> {
&import_path,
);
let initial_event_enum = expand_any_with_deser(
name,
events,
attrs,
&variants,
&EventKindVariation::Initial,
&import_path,
);
let redacted_event_enums = expand_any_redacted(name, events, attrs, &variants, &import_path);
let event_content_enum = expand_content_enum(name, events, attrs, &variants, &import_path);
@ -82,6 +98,8 @@ pub fn expand_event_enum(input: EventEnumInput) -> syn::Result<TokenStream> {
#stripped_event_enum
#initial_event_enum
#redacted_event_enums
#event_content_enum
@ -470,7 +488,14 @@ fn expand_redacted_enum(
if let EventKind::State | EventKind::Message = kind {
let ident = format_ident!("AnyPossiblyRedacted{}", kind.to_event_ident(var)?);
let (regular_enum_ident, redacted_enum_ident) = inner_enum_idents(kind, var)?;
// FIXME: Use Option::zip once MSRV >= 1.46
let (regular_enum_ident, redacted_enum_ident) = match inner_enum_idents(kind, var) {
(Some(regular_enum_ident), Some(redacted_enum_ident)) => {
(regular_enum_ident, redacted_enum_ident)
}
_ => return None,
};
Some(quote! {
/// An enum that holds either regular un-redacted events or redacted events.
#[derive(Clone, Debug, #import_path::exports::serde::Serialize)]
@ -671,21 +696,21 @@ fn accessor_methods(
})
}
fn inner_enum_idents(kind: &EventKind, var: &EventKindVariation) -> Option<(Ident, Ident)> {
fn inner_enum_idents(kind: &EventKind, var: &EventKindVariation) -> (Option<Ident>, Option<Ident>) {
match var {
EventKindVariation::Full => Some((
kind.to_event_enum_ident(var)?,
kind.to_event_enum_ident(&EventKindVariation::Redacted)?,
)),
EventKindVariation::Sync => Some((
kind.to_event_enum_ident(var)?,
kind.to_event_enum_ident(&EventKindVariation::RedactedSync)?,
)),
EventKindVariation::Stripped => Some((
kind.to_event_enum_ident(var)?,
kind.to_event_enum_ident(&EventKindVariation::RedactedStripped)?,
)),
_ => None,
EventKindVariation::Full => {
(kind.to_event_enum_ident(var), kind.to_event_enum_ident(&EventKindVariation::Redacted))
}
EventKindVariation::Sync => (
kind.to_event_enum_ident(var),
kind.to_event_enum_ident(&EventKindVariation::RedactedSync),
),
EventKindVariation::Stripped => (
kind.to_event_enum_ident(var),
kind.to_event_enum_ident(&EventKindVariation::RedactedStripped),
),
EventKindVariation::Initial => (kind.to_event_enum_ident(var), None),
_ => (None, None),
}
}
@ -739,6 +764,7 @@ fn to_event_path(name: &LitStr, struct_name: &Ident, import_path: &TokenStream)
"ToDeviceEvent"
| "SyncStateEvent"
| "StrippedStateEvent"
| "InitialStateEvent"
| "SyncMessageEvent"
| "SyncEphemeralRoomEvent" => {
let content = format_ident!("{}EventContent", event);

View File

@ -16,11 +16,12 @@ mod kw {
}
// If the variants of this enum change `to_event_path` needs to be updated as well.
#[derive(Eq, PartialEq)]
#[derive(Clone, Copy, Eq, PartialEq)]
pub enum EventKindVariation {
Full,
Sync,
Stripped,
Initial,
Redacted,
RedactedSync,
RedactedStripped,
@ -32,6 +33,7 @@ impl fmt::Display for EventKindVariation {
EventKindVariation::Full => write!(f, ""),
EventKindVariation::Sync => write!(f, "Sync"),
EventKindVariation::Stripped => write!(f, "Stripped"),
EventKindVariation::Initial => write!(f, "Initial"),
EventKindVariation::Redacted => write!(f, "Redacted"),
EventKindVariation::RedactedSync => write!(f, "RedactedSync"),
EventKindVariation::RedactedStripped => write!(f, "RedactedStripped"),
@ -49,9 +51,10 @@ impl EventKindVariation {
EventKindVariation::Redacted
| EventKindVariation::RedactedSync
| EventKindVariation::RedactedStripped => EventKindVariation::Redacted,
EventKindVariation::Full | EventKindVariation::Sync | EventKindVariation::Stripped => {
EventKindVariation::Full
}
EventKindVariation::Full
| EventKindVariation::Sync
| EventKindVariation::Stripped
| EventKindVariation::Initial => EventKindVariation::Full,
}
}
}
@ -101,6 +104,7 @@ impl EventKind {
| (Self::Message, V::Sync)
| (Self::State, V::Sync)
| (Self::State, V::Stripped)
| (Self::State, V::Initial)
| (Self::Message, V::Redacted)
| (Self::State, V::Redacted)
| (Self::Message, V::RedactedSync)
@ -161,6 +165,7 @@ pub fn to_kind_variation(ident: &Ident) -> Option<(EventKind, EventKindVariation
"StateEvent" => Some((EventKind::State, EventKindVariation::Full)),
"SyncStateEvent" => Some((EventKind::State, EventKindVariation::Sync)),
"StrippedStateEvent" => Some((EventKind::State, EventKindVariation::Stripped)),
"InitialStateEvent" => Some((EventKind::State, EventKindVariation::Initial)),
"RedactedStateEvent" => Some((EventKind::State, EventKindVariation::Redacted)),
"RedactedSyncStateEvent" => Some((EventKind::State, EventKindVariation::RedactedSync)),
"RedactedStrippedStateEvent" => {

View File

@ -216,6 +216,19 @@ pub struct StrippedStateEvent<C: StateEventContent> {
pub state_key: String,
}
/// A minimal state event, used for creating a new room.
#[derive(Clone, Debug, Event)]
pub struct InitialStateEvent<C: StateEventContent> {
/// Data specific to the event type.
pub content: C,
/// A unique key which defines the overwriting semantics for this piece of room state.
///
/// This is often an empty string, but some events send a `UserId` to show
/// which user the event affects.
pub state_key: String,
}
/// A redacted state event.
///
/// `RedactedStateEvent` implements the comparison traits using only

View File

@ -180,21 +180,21 @@ pub mod typing;
pub use self::{
enums::{
AnyBasicEvent, AnyBasicEventContent, AnyEphemeralRoomEvent, AnyEphemeralRoomEventContent,
AnyEvent, AnyMessageEvent, AnyMessageEventContent, AnyPossiblyRedactedMessageEvent,
AnyPossiblyRedactedStateEvent, AnyPossiblyRedactedStrippedStateEvent,
AnyPossiblyRedactedSyncMessageEvent, AnyPossiblyRedactedSyncStateEvent,
AnyRedactedMessageEvent, AnyRedactedStateEvent, AnyRedactedStrippedStateEvent,
AnyRedactedSyncMessageEvent, AnyRedactedSyncStateEvent, AnyRoomEvent, AnyStateEvent,
AnyStateEventContent, AnyStrippedStateEvent, AnySyncEphemeralRoomEvent,
AnySyncMessageEvent, AnySyncRoomEvent, AnySyncStateEvent, AnyToDeviceEvent,
AnyToDeviceEventContent,
AnyEvent, AnyInitialStateEvent, AnyMessageEvent, AnyMessageEventContent,
AnyPossiblyRedactedMessageEvent, AnyPossiblyRedactedStateEvent,
AnyPossiblyRedactedStrippedStateEvent, AnyPossiblyRedactedSyncMessageEvent,
AnyPossiblyRedactedSyncStateEvent, AnyRedactedMessageEvent, AnyRedactedStateEvent,
AnyRedactedStrippedStateEvent, AnyRedactedSyncMessageEvent, AnyRedactedSyncStateEvent,
AnyRoomEvent, AnyStateEvent, AnyStateEventContent, AnyStrippedStateEvent,
AnySyncEphemeralRoomEvent, AnySyncMessageEvent, AnySyncRoomEvent, AnySyncStateEvent,
AnyToDeviceEvent, AnyToDeviceEventContent,
},
error::{FromStrError, InvalidInput},
event_kinds::{
BasicEvent, EphemeralRoomEvent, MessageEvent, RedactedMessageEvent, RedactedStateEvent,
RedactedStrippedStateEvent, RedactedSyncMessageEvent, RedactedSyncStateEvent, StateEvent,
StrippedStateEvent, SyncEphemeralRoomEvent, SyncMessageEvent, SyncStateEvent,
ToDeviceEvent,
BasicEvent, EphemeralRoomEvent, InitialStateEvent, MessageEvent, RedactedMessageEvent,
RedactedStateEvent, RedactedStrippedStateEvent, RedactedSyncMessageEvent,
RedactedSyncStateEvent, StateEvent, StrippedStateEvent, SyncEphemeralRoomEvent,
SyncMessageEvent, SyncStateEvent, ToDeviceEvent,
},
event_type::EventType,
};