Replace r0::room::create_room::InitialStateEvent
with ruma_events::InitialStateEvent
This commit is contained in:
parent
6006e0b52e
commit
578f6c8925
@ -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:
|
||||
|
||||
|
@ -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>,
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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" => {
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user