ruma_client_api/room/
create_room.rs1pub mod v3 {
6 use assign::assign;
11 use ruma_common::{
12 api::{request, response, Metadata},
13 metadata,
14 room::RoomType,
15 serde::{Raw, StringEnum},
16 OwnedRoomId, OwnedUserId, RoomVersionId,
17 };
18 use ruma_events::{
19 room::{
20 create::{PreviousRoom, RoomCreateEventContent},
21 power_levels::RoomPowerLevelsEventContent,
22 },
23 AnyInitialStateEvent,
24 };
25 use serde::{Deserialize, Serialize};
26
27 use crate::{membership::Invite3pid, room::Visibility, PrivOwnedStr};
28
29 const METADATA: Metadata = metadata! {
30 method: POST,
31 rate_limited: false,
32 authentication: AccessToken,
33 history: {
34 1.0 => "/_matrix/client/r0/createRoom",
35 1.1 => "/_matrix/client/v3/createRoom",
36 }
37 };
38
39 #[request(error = crate::Error)]
41 #[derive(Default)]
42 pub struct Request {
43 #[serde(default, skip_serializing_if = "Option::is_none")]
45 pub creation_content: Option<Raw<CreationContent>>,
46
47 #[serde(default, skip_serializing_if = "<[_]>::is_empty")]
51 pub initial_state: Vec<Raw<AnyInitialStateEvent>>,
52
53 #[serde(default, skip_serializing_if = "<[_]>::is_empty")]
57 pub invite: Vec<OwnedUserId>,
58
59 #[serde(default, skip_serializing_if = "<[_]>::is_empty")]
61 pub invite_3pid: Vec<Invite3pid>,
62
63 #[serde(default, skip_serializing_if = "ruma_common::serde::is_default")]
65 pub is_direct: bool,
66
67 #[serde(skip_serializing_if = "Option::is_none")]
70 pub name: Option<String>,
71
72 #[serde(skip_serializing_if = "Option::is_none")]
74 pub power_level_content_override: Option<Raw<RoomPowerLevelsEventContent>>,
75
76 #[serde(skip_serializing_if = "Option::is_none")]
78 pub preset: Option<RoomPreset>,
79
80 #[serde(skip_serializing_if = "Option::is_none")]
82 pub room_alias_name: Option<String>,
83
84 #[serde(skip_serializing_if = "Option::is_none")]
88 pub room_version: Option<RoomVersionId>,
89
90 #[serde(skip_serializing_if = "Option::is_none")]
93 pub topic: Option<String>,
94
95 #[serde(default, skip_serializing_if = "ruma_common::serde::is_default")]
100 pub visibility: Visibility,
101 }
102
103 #[response(error = crate::Error)]
105 pub struct Response {
106 pub room_id: OwnedRoomId,
108 }
109
110 impl Request {
111 pub fn new() -> Self {
113 Default::default()
114 }
115 }
116
117 impl Response {
118 pub fn new(room_id: OwnedRoomId) -> Self {
120 Self { room_id }
121 }
122 }
123
124 #[derive(Clone, Debug, Deserialize, Serialize)]
129 #[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
130 pub struct CreationContent {
131 #[serde(
135 rename = "m.federate",
136 default = "ruma_common::serde::default_true",
137 skip_serializing_if = "ruma_common::serde::is_true"
138 )]
139 pub federate: bool,
140
141 #[serde(skip_serializing_if = "Option::is_none")]
143 pub predecessor: Option<PreviousRoom>,
144
145 #[serde(skip_serializing_if = "Option::is_none", rename = "type")]
149 pub room_type: Option<RoomType>,
150 }
151
152 impl CreationContent {
153 pub fn new() -> Self {
155 Self { federate: true, predecessor: None, room_type: None }
156 }
157
158 pub fn into_event_content(
161 self,
162 creator: OwnedUserId,
163 room_version: RoomVersionId,
164 ) -> RoomCreateEventContent {
165 assign!(RoomCreateEventContent::new_v1(creator), {
166 federate: self.federate,
167 room_version: room_version,
168 predecessor: self.predecessor,
169 room_type: self.room_type
170 })
171 }
172
173 pub fn is_empty(&self) -> bool {
175 self.federate && self.predecessor.is_none() && self.room_type.is_none()
176 }
177 }
178
179 impl Default for CreationContent {
180 fn default() -> Self {
181 Self::new()
182 }
183 }
184
185 #[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/string_enum.md"))]
187 #[derive(Clone, PartialEq, Eq, StringEnum)]
188 #[ruma_enum(rename_all = "snake_case")]
189 #[non_exhaustive]
190 pub enum RoomPreset {
191 PrivateChat,
193
194 PublicChat,
196
197 TrustedPrivateChat,
200
201 #[doc(hidden)]
202 _Custom(PrivOwnedStr),
203 }
204}