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}; use serde::{Deserialize, Serialize};
/// Whether or not a newly created room will be listed in the room directory. /// 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")] #[serde(rename_all = "snake_case")]
pub enum Visibility { pub enum Visibility {
/// Indicates that the room will be shown in the published room list. /// 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. /// Indicates that the room will not be shown in the published room list.
Private, Private,
} }
impl Default for Visibility {
fn default() -> Self {
Self::Private
}
}

View File

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