client-api: Fix a bunch of issues for room::create_room

This commit is contained in:
Jonas Platte 2020-08-25 16:20:07 +02:00
parent 3b36a974fa
commit 7c31fceb61
No known key found for this signature in database
GPG Key ID: CC154DE0E30B7C67
2 changed files with 47 additions and 20 deletions

View File

@ -8,7 +8,8 @@ pub mod upgrade_room;
use serde::{Deserialize, Serialize};
/// Whether or not a newly created room will be listed in the room directory.
#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Deserialize, Serialize)]
#[non_exhaustive]
#[serde(rename_all = "snake_case")]
pub enum Visibility {
/// Indicates that the room will be shown in the published room list.
@ -17,3 +18,9 @@ pub enum Visibility {
/// Indicates that the room will not be shown in the published room list.
Private,
}
impl Default for Visibility {
fn default() -> Self {
Self::Private
}
}

View File

@ -30,34 +30,34 @@ ruma_api! {
#[non_exhaustive]
request: {
/// Extra keys to be added to the content of the `m.room.create`.
#[serde(skip_serializing_if = "Option::is_none")]
pub creation_content: Option<CreationContent>,
#[serde(default, skip_serializing_if = "CreationContent::is_empty")]
pub creation_content: CreationContent,
/// List of state events to send to the new room.
///
/// 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<AnyInitialStateEvent>,
#[serde(default, skip_serializing_if = "<[_]>::is_empty")]
pub initial_state: &'a [AnyInitialStateEvent],
/// A list of user IDs to invite to the room.
///
/// This will tell the server to invite everyone in the list to the newly created room.
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub invite: Vec<UserId>,
#[serde(default, skip_serializing_if = "<[_]>::is_empty")]
pub invite: &'a [UserId],
/// List of third party IDs of users to invite.
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub invite_3pid: Vec<Invite3pid>,
#[serde(default, skip_serializing_if = "<[_]>::is_empty")]
pub invite_3pid: &'a [Invite3pid],
/// If set, this sets the `is_direct` flag on room invites.
#[serde(skip_serializing_if = "Option::is_none")]
pub is_direct: Option<bool>,
#[serde(default, skip_serializing_if = "ruma_serde::is_default")]
pub is_direct: bool,
/// If this is included, an `m.room.name` event will be sent into the room to indicate
/// the name of the room.
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
pub name: Option<&'a str>,
/// Power level content to override in the default power level event.
#[serde(skip_serializing_if = "Option::is_none")]
@ -69,22 +69,23 @@ ruma_api! {
/// The desired room alias local part.
#[serde(skip_serializing_if = "Option::is_none")]
pub room_alias_name: Option<String>,
pub room_alias_name: Option<&'a str>,
/// Room version to set for the room. Defaults to homeserver's default if not specified.
#[serde(skip_serializing_if = "Option::is_none")]
pub room_version: Option<String>,
pub room_version: Option<&'a RoomVersionId>,
/// If this is included, an `m.room.topic` event will be sent into the room to indicate
/// the topic for the room.
#[serde(skip_serializing_if = "Option::is_none")]
pub topic: Option<String>,
pub topic: Option<&'a str>,
/// A public visibility indicates that the room will be shown in the published room
/// list. A private visibility will hide the room from the published room list. Rooms
/// default to private visibility if this key is not included.
#[serde(skip_serializing_if = "Option::is_none")]
pub visibility: Option<Visibility>,
/// list. A private visibility will hide the room from the published room list.
///
/// Defaults to `Private`.
#[serde(default, skip_serializing_if = "ruma_serde::is_default")]
pub visibility: Visibility,
}
#[non_exhaustive]
@ -96,7 +97,7 @@ ruma_api! {
error: crate::Error
}
impl Request {
impl<'a> Request<'a> {
/// Creates a `Request` will all-default parameters.
pub fn new() -> Self {
Default::default()
@ -115,6 +116,7 @@ impl Response {
/// This is the same as the event content struct for `m.room.create`, but without some fields that
/// servers are supposed to ignore.
#[derive(Clone, Debug, Deserialize, Serialize)]
#[non_exhaustive]
pub struct CreationContent {
/// Whether users on other servers can join this room.
///
@ -125,12 +127,18 @@ pub struct CreationContent {
skip_serializing_if = "ruma_serde::is_true"
)]
pub federate: bool,
/// A reference to the room this room replaces, if the previous room was upgraded.
#[serde(skip_serializing_if = "Option::is_none")]
pub predecessor: Option<PreviousRoom>,
}
impl CreationContent {
/// Creates a new `CreationContent` with all fields defaulted.
pub fn new() -> Self {
Self { federate: true, predecessor: None }
}
/// Given a `CreationContent` and the other fields that a homeserver has to fill, construct
/// a `CreateEventContent`.
pub fn into_event_content(
@ -140,10 +148,22 @@ impl CreationContent {
) -> CreateEventContent {
assign!(CreateEventContent::new(creator), { federate, room_version, predecessor })
}
/// Returns whether all fields have their default value.
pub fn is_empty(&self) -> bool {
self.federate && self.predecessor.is_none()
}
}
impl Default for CreationContent {
fn default() -> Self {
Self::new()
}
}
/// A convenience parameter for setting a few default state events.
#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
#[non_exhaustive]
#[serde(rename_all = "snake_case")]
pub enum RoomPreset {
/// `join_rules` is set to `invite` and `history_visibility` is set to `shared`.