1use serde::{Deserialize, Serialize};
2
3use crate::message::channel_permission::*;
4use crate::{field_access, StreamPostPolicy, TopicsPolicy};
5
6#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
8pub struct BasicChannel {
9 #[serde(skip_serializing_if = "Option::is_none")]
10 stream_id: Option<u64>,
11 #[serde(skip_serializing_if = "Option::is_none")]
12 name: Option<String>,
13 #[serde(skip_serializing_if = "Option::is_none")]
14 is_archived: Option<bool>,
15 #[serde(skip_serializing_if = "Option::is_none")]
16 description: Option<String>,
17 #[serde(skip_serializing_if = "Option::is_none")]
18 date_created: Option<u64>,
19 #[serde(skip_serializing_if = "Option::is_none")]
20 creator_id: Option<u64>,
21 #[serde(skip_serializing_if = "Option::is_none")]
22 invite_only: Option<bool>,
23 #[serde(skip_serializing_if = "Option::is_none")]
24 rendered_description: Option<String>,
25 #[serde(skip_serializing_if = "Option::is_none")]
26 is_web_public: Option<bool>,
27 #[serde(skip_serializing_if = "Option::is_none")]
28 stream_post_policy: Option<StreamPostPolicy>,
29 #[serde(skip_serializing_if = "Option::is_none")]
30 message_retention_days: Option<i64>,
31 #[serde(skip_serializing_if = "Option::is_none")]
32 history_public_to_subscribers: Option<bool>,
33 #[serde(skip_serializing_if = "Option::is_none")]
34 topics_policy: Option<TopicsPolicy>,
35 #[serde(skip_serializing_if = "Option::is_none")]
36 first_message_id: Option<u64>,
37 #[serde(skip_serializing_if = "Option::is_none")]
38 folder_id: Option<u64>,
39 #[serde(skip_serializing_if = "Option::is_none")]
40 is_recently_active: Option<bool>,
41 #[serde(skip_serializing_if = "Option::is_none")]
42 is_announcement_only: Option<bool>,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 can_add_subscribers_group: Option<CanAddSubscribersGroup>,
45 #[serde(skip_serializing_if = "Option::is_none")]
46 can_remove_subscribers_group: Option<CanRemoveSubscribersGroup>,
47 #[serde(skip_serializing_if = "Option::is_none")]
48 can_administer_channel_group: Option<CanAdministerChannelGroup>,
49 #[serde(skip_serializing_if = "Option::is_none")]
50 can_delete_any_message_group: Option<CanDeleteAnyMessageGroup>,
51 #[serde(skip_serializing_if = "Option::is_none")]
52 can_delete_own_message_group: Option<CanDeleteOwnMessageGroup>,
53 #[serde(skip_serializing_if = "Option::is_none")]
54 can_move_messages_out_of_channel_group: Option<CanMoveMessagesOutOfChannelGroup>,
55 #[serde(skip_serializing_if = "Option::is_none")]
56 can_move_messages_within_channel_group: Option<CanMoveMessagesWithinChannelGroup>,
57 #[serde(skip_serializing_if = "Option::is_none")]
58 can_send_message_group: Option<CanSendMessageGroup>,
59 #[serde(skip_serializing_if = "Option::is_none")]
60 can_subscribe_group: Option<CanSubscribeGroup>,
61 #[serde(skip_serializing_if = "Option::is_none")]
62 can_resolve_topics_group: Option<CanResolveTopicsGroup>,
63 #[serde(skip_serializing_if = "Option::is_none")]
64 subscriber_count: Option<f64>,
65}
66
67impl BasicChannel {
68 pub const fn new() -> Self {
70 Self {
71 stream_id: None,
72 name: None,
73 is_archived: None,
74 description: None,
75 date_created: None,
76 creator_id: None,
77 invite_only: None,
78 rendered_description: None,
79 is_web_public: None,
80 stream_post_policy: None,
81 message_retention_days: None,
82 history_public_to_subscribers: None,
83 topics_policy: None,
84 first_message_id: None,
85 folder_id: None,
86 is_recently_active: None,
87 is_announcement_only: None,
88 can_add_subscribers_group: None,
89 can_remove_subscribers_group: None,
90 can_administer_channel_group: None,
91 can_delete_any_message_group: None,
92 can_delete_own_message_group: None,
93 can_move_messages_out_of_channel_group: None,
94 can_move_messages_within_channel_group: None,
95 can_send_message_group: None,
96 can_subscribe_group: None,
97 can_resolve_topics_group: None,
98 subscriber_count: None,
99 }
100 }
101}
102
103field_access! {
104 BasicChannel {
105 stream_id: option { u64 },
107 is_archived: option { bool },
111 date_created: option { u64 },
115 creator_id: option { u64 },
122 invite_only: option { bool },
126 is_web_public: option { bool },
130 stream_post_policy: option { StreamPostPolicy },
132 message_retention_days: option { i64 },
141 history_public_to_subscribers: option { bool },
146 topics_policy: option { TopicsPolicy },
149 first_message_id: option { u64 },
157 folder_id: option { u64 },
163 is_recently_active: option { bool },
169 is_announcement_only: option { bool },
173 subscriber_count: option { f64 },
186 }
187}
188
189field_access! {
190 BasicChannel {
191 name: option_cow_deref { str, String },
193 description: option_cow_deref { str, String },
197 rendered_description: option_cow_deref { str, String },
202 }
203}
204
205field_access! {
206 BasicChannel {
207 can_add_subscribers_group: option_cow_ref { CanAddSubscribersGroup },
210 can_remove_subscribers_group: option_cow_ref { CanRemoveSubscribersGroup },
213 can_administer_channel_group: option_cow_ref { CanAdministerChannelGroup },
216 can_delete_any_message_group: option_cow_ref { CanDeleteAnyMessageGroup },
219 can_delete_own_message_group: option_cow_ref { CanDeleteOwnMessageGroup },
222 can_move_messages_out_of_channel_group: option_cow_ref { CanMoveMessagesOutOfChannelGroup },
225 can_move_messages_within_channel_group: option_cow_ref { CanMoveMessagesWithinChannelGroup },
228 can_send_message_group: option_cow_ref { CanSendMessageGroup },
231 can_subscribe_group: option_cow_ref { CanSubscribeGroup },
234 can_resolve_topics_group: option_cow_ref { CanResolveTopicsGroup },
237 }
238}
239
240impl Default for BasicChannel {
241 fn default() -> Self {
242 Self::new()
243 }
244}
245
246impl std::fmt::Display for BasicChannel {
247 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
248 serde_json::to_string(self)
249 .map_err(|_| std::fmt::Error)
250 .and_then(|s| write!(f, "{s}"))
251 }
252}
253
254#[cfg(test)]
255mod tests {
256 use super::*;
257
258 #[test]
259 fn test_basic_channel() {
260 let stream_id = 1;
261 let name = "test_name";
262 let is_archived = false;
263 let description = "test_description";
264 let date_created = 2;
265 let creator_id = 3;
266 let invite_only = true;
267 let rendered_description = "<p>test</p>";
268 let is_web_public = true;
269 let stream_post_policy = StreamPostPolicy::new();
270 let message_retention_days = -1;
271 let history_public_to_subscribers = true;
272 let topics_policy = TopicsPolicy::new();
273 let first_message_id = 4;
274 let folder_id = 5;
275 let is_recently_active = true;
276 let is_announcement_only = false;
277 let can_add_subscribers_group = CanAddSubscribersGroup::new();
278 let can_remove_subscribers_group = CanRemoveSubscribersGroup::new();
279 let can_administer_channel_group = CanAdministerChannelGroup::new();
280 let can_delete_any_message_group = CanDeleteAnyMessageGroup::new();
281 let can_delete_own_message_group = CanDeleteOwnMessageGroup::new();
282 let can_move_messages_out_of_channel_group = CanMoveMessagesOutOfChannelGroup::new();
283 let can_move_messages_within_channel_group = CanMoveMessagesWithinChannelGroup::new();
284 let can_send_message_group = CanSendMessageGroup::new();
285 let can_subscribe_group = CanSubscribeGroup::new();
286 let can_resolve_topics_group = CanResolveTopicsGroup::new();
287 let subscriber_count = 1.0f64;
288
289 let basic_channel = BasicChannel::new()
290 .with_stream_id(stream_id)
291 .with_name(name)
292 .with_is_archived(is_archived)
293 .with_description(description)
294 .with_date_created(date_created)
295 .with_creator_id(creator_id)
296 .with_invite_only(invite_only)
297 .with_rendered_description(rendered_description)
298 .with_is_web_public(is_web_public)
299 .with_stream_post_policy(stream_post_policy)
300 .with_message_retention_days(message_retention_days)
301 .with_history_public_to_subscribers(history_public_to_subscribers)
302 .with_topics_policy(topics_policy)
303 .with_first_message_id(first_message_id)
304 .with_folder_id(folder_id)
305 .with_is_recently_active(is_recently_active)
306 .with_is_announcement_only(is_announcement_only)
307 .with_can_add_subscribers_group(&can_add_subscribers_group)
308 .with_can_remove_subscribers_group(&can_remove_subscribers_group)
309 .with_can_administer_channel_group(&can_administer_channel_group)
310 .with_can_delete_any_message_group(&can_delete_any_message_group)
311 .with_can_delete_own_message_group(&can_delete_own_message_group)
312 .with_can_move_messages_out_of_channel_group(&can_move_messages_out_of_channel_group)
313 .with_can_move_messages_within_channel_group(&can_move_messages_within_channel_group)
314 .with_can_send_message_group(&can_send_message_group)
315 .with_can_subscribe_group(&can_subscribe_group)
316 .with_can_resolve_topics_group(&can_resolve_topics_group)
317 .with_subscriber_count(subscriber_count);
318 let basic_channel_json = basic_channel.to_string();
319
320 assert_eq!(
321 serde_json::to_string(&basic_channel).unwrap(),
322 basic_channel_json
323 );
324 assert_eq!(
325 serde_json::from_str::<BasicChannel>(&basic_channel_json).unwrap(),
326 basic_channel
327 );
328
329 assert_eq!(basic_channel.stream_id(), Some(stream_id));
330 assert_eq!(basic_channel.name(), Some(name));
331 assert_eq!(basic_channel.is_archived(), Some(is_archived));
332 assert_eq!(basic_channel.description(), Some(description));
333 assert_eq!(basic_channel.date_created(), Some(date_created));
334 assert_eq!(basic_channel.creator_id(), Some(creator_id));
335 assert_eq!(basic_channel.invite_only(), Some(invite_only));
336 assert_eq!(
337 basic_channel.rendered_description(),
338 Some(rendered_description)
339 );
340 assert_eq!(basic_channel.is_web_public(), Some(is_web_public));
341 assert_eq!(basic_channel.stream_post_policy(), Some(stream_post_policy));
342 assert_eq!(
343 basic_channel.message_retention_days(),
344 Some(message_retention_days)
345 );
346 assert_eq!(
347 basic_channel.history_public_to_subscribers(),
348 Some(history_public_to_subscribers)
349 );
350 assert_eq!(basic_channel.topics_policy(), Some(topics_policy));
351 assert_eq!(basic_channel.first_message_id(), Some(first_message_id));
352 assert_eq!(basic_channel.folder_id(), Some(folder_id));
353 assert_eq!(basic_channel.is_recently_active(), Some(is_recently_active));
354 assert_eq!(
355 basic_channel.is_announcement_only(),
356 Some(is_announcement_only)
357 );
358 assert_eq!(
359 basic_channel.can_add_subscribers_group(),
360 Some(&can_add_subscribers_group)
361 );
362 assert_eq!(
363 basic_channel.can_remove_subscribers_group(),
364 Some(&can_remove_subscribers_group)
365 );
366 assert_eq!(
367 basic_channel.can_administer_channel_group(),
368 Some(&can_administer_channel_group)
369 );
370 assert_eq!(
371 basic_channel.can_delete_any_message_group(),
372 Some(&can_delete_any_message_group)
373 );
374 assert_eq!(
375 basic_channel.can_delete_own_message_group(),
376 Some(&can_delete_own_message_group)
377 );
378 assert_eq!(
379 basic_channel.can_move_messages_out_of_channel_group(),
380 Some(&can_move_messages_out_of_channel_group)
381 );
382 assert_eq!(
383 basic_channel.can_move_messages_within_channel_group(),
384 Some(&can_move_messages_within_channel_group)
385 );
386 assert_eq!(
387 basic_channel.can_send_message_group(),
388 Some(&can_send_message_group)
389 );
390 assert_eq!(
391 basic_channel.can_subscribe_group(),
392 Some(&can_subscribe_group)
393 );
394 assert_eq!(
395 basic_channel.can_resolve_topics_group(),
396 Some(&can_resolve_topics_group)
397 );
398 assert_eq!(basic_channel.subscriber_count(), Some(subscriber_count));
399 }
400}