1use serde::{Deserialize, Serialize};
2
3use crate::message::channel_permission::*;
4use crate::{field_access, impl_default, impl_display, StreamPostPolicy, TopicsPolicy};
5
6#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
12pub struct NeverSubscribed {
13 #[serde(skip_serializing_if = "Option::is_none")]
14 stream_id: Option<u64>,
15 #[serde(skip_serializing_if = "Option::is_none")]
16 name: Option<String>,
17 #[serde(skip_serializing_if = "Option::is_none")]
18 is_archived: Option<bool>,
19 #[serde(skip_serializing_if = "Option::is_none")]
20 description: Option<String>,
21 #[serde(skip_serializing_if = "Option::is_none")]
22 date_created: Option<u64>,
23 #[serde(skip_serializing_if = "Option::is_none")]
24 creator_id: Option<u64>,
25 #[serde(skip_serializing_if = "Option::is_none")]
26 invite_only: Option<bool>,
27 #[serde(skip_serializing_if = "Option::is_none")]
28 rendered_description: Option<String>,
29 #[serde(skip_serializing_if = "Option::is_none")]
30 is_web_public: Option<bool>,
31 #[serde(skip_serializing_if = "Option::is_none")]
32 stream_post_policy: Option<StreamPostPolicy>,
33 #[serde(skip_serializing_if = "Option::is_none")]
34 message_retention_days: Option<u64>,
35 #[serde(skip_serializing_if = "Option::is_none")]
36 history_public_to_subscribers: Option<bool>,
37 #[serde(skip_serializing_if = "Option::is_none")]
38 topics_policy: Option<TopicsPolicy>,
39 #[serde(skip_serializing_if = "Option::is_none")]
40 first_message_id: Option<u64>,
41 #[serde(skip_serializing_if = "Option::is_none")]
42 folder_id: Option<u64>,
43 #[serde(skip_serializing_if = "Option::is_none")]
44 is_recently_active: Option<bool>,
45 #[serde(skip_serializing_if = "Option::is_none")]
46 is_announcement_only: Option<bool>,
47 #[serde(skip_serializing_if = "Option::is_none")]
48 can_add_subscribers_group: Option<CanAddSubscribersGroup>,
49 #[serde(skip_serializing_if = "Option::is_none")]
50 can_remove_subscribers_group: Option<CanRemoveSubscribersGroup>,
51 #[serde(skip_serializing_if = "Option::is_none")]
52 can_administer_channel_group: Option<CanAdministerChannelGroup>,
53 #[serde(skip_serializing_if = "Option::is_none")]
54 can_delete_any_message_group: Option<CanDeleteAnyMessageGroup>,
55 #[serde(skip_serializing_if = "Option::is_none")]
56 can_delete_own_message_group: Option<CanDeleteOwnMessageGroup>,
57 #[serde(skip_serializing_if = "Option::is_none")]
58 can_move_messages_out_of_channel_group: Option<CanMoveMessagesOutOfChannelGroup>,
59 #[serde(skip_serializing_if = "Option::is_none")]
60 can_move_messages_within_channel_group: Option<CanMoveMessagesWithinChannelGroup>,
61 #[serde(skip_serializing_if = "Option::is_none")]
62 can_send_message_group: Option<CanSendMessageGroup>,
63 #[serde(skip_serializing_if = "Option::is_none")]
64 can_subscribe_group: Option<CanSubscribeGroup>,
65 #[serde(skip_serializing_if = "Option::is_none")]
66 can_resolve_topics_group: Option<CanResolveTopicsGroup>,
67 #[serde(skip_serializing_if = "Option::is_none")]
68 subscriber_count: Option<u64>,
69 #[serde(skip_serializing_if = "Option::is_none")]
70 stream_weekly_traffic: Option<u64>,
71 #[serde(skip_serializing_if = "Option::is_none")]
72 subscribers: Option<Vec<u64>>,
73 #[serde(skip_serializing_if = "Option::is_none")]
74 partial_subscribers: Option<Vec<u64>>,
75}
76
77impl NeverSubscribed {
78 pub const fn new() -> Self {
80 Self {
81 stream_id: None,
82 name: None,
83 is_archived: None,
84 description: None,
85 date_created: None,
86 creator_id: None,
87 invite_only: None,
88 rendered_description: None,
89 is_web_public: None,
90 stream_post_policy: None,
91 message_retention_days: None,
92 history_public_to_subscribers: None,
93 topics_policy: None,
94 first_message_id: None,
95 folder_id: None,
96 is_recently_active: None,
97 is_announcement_only: None,
98 can_add_subscribers_group: None,
99 can_remove_subscribers_group: None,
100 can_administer_channel_group: None,
101 can_delete_any_message_group: None,
102 can_delete_own_message_group: None,
103 can_move_messages_out_of_channel_group: None,
104 can_move_messages_within_channel_group: None,
105 can_send_message_group: None,
106 can_subscribe_group: None,
107 can_resolve_topics_group: None,
108 subscriber_count: None,
109 stream_weekly_traffic: None,
110 subscribers: None,
111 partial_subscribers: None,
112 }
113 }
114}
115
116field_access! {
117 NeverSubscribed {
118 stream_id: option { u64 },
119 is_archived: option { bool },
120 date_created: option { u64 },
121 creator_id: option { u64 },
122 invite_only: option { bool },
123 is_web_public: option { bool },
124 stream_post_policy: option { StreamPostPolicy },
125 message_retention_days: option { u64 },
126 history_public_to_subscribers: option { bool },
127 topics_policy: option { TopicsPolicy },
128 first_message_id: option { u64 },
129 folder_id: option { u64 },
130 is_recently_active: option { bool },
131 is_announcement_only: option { bool },
132 subscriber_count: option { u64 },
133 stream_weekly_traffic: option { u64 },
137 }
138}
139
140field_access! {
141 NeverSubscribed {
142 name: option_cow_deref { str, String },
143 description: option_cow_deref { str, String },
144 rendered_description: option_cow_deref { str, String },
145 }
146}
147
148field_access! {
149 NeverSubscribed {
150 can_add_subscribers_group: option_cow_ref { CanAddSubscribersGroup },
151 can_remove_subscribers_group: option_cow_ref { CanRemoveSubscribersGroup },
152 can_administer_channel_group: option_cow_ref { CanAdministerChannelGroup },
153 can_delete_any_message_group: option_cow_ref { CanDeleteAnyMessageGroup },
154 can_delete_own_message_group: option_cow_ref { CanDeleteOwnMessageGroup },
155 can_move_messages_out_of_channel_group: option_cow_ref { CanMoveMessagesOutOfChannelGroup },
156 can_move_messages_within_channel_group: option_cow_ref { CanMoveMessagesWithinChannelGroup },
157 can_send_message_group: option_cow_ref { CanSendMessageGroup },
158 can_subscribe_group: option_cow_ref { CanSubscribeGroup },
159 can_resolve_topics_group: option_cow_ref { CanResolveTopicsGroup },
160 }
161}
162
163field_access! {
164 NeverSubscribed {
165 subscribers: option_cow_deref { [u64], Vec<u64> },
173 partial_subscribers: option_cow_deref { [u64], Vec<u64> },
184 }
185}
186
187impl_default!(NeverSubscribed);
188impl_display!(NeverSubscribed);
189
190#[cfg(test)]
191mod tests {
192 use super::*;
193
194 #[test]
195 fn test_never_subscribed() {
196 let stream_id = 1;
197 let name = "test name";
198 let is_archived = true;
199 let description = "test description";
200 let date_created = 2;
201 let creator_id = 3;
202 let invite_only = false;
203 let rendered_description = "<p>description</p>";
204 let is_web_public = true;
205 let stream_post_policy = StreamPostPolicy::new();
206 let message_retention_days = 4;
207 let history_public_to_subscribers = false;
208 let topics_policy = TopicsPolicy::new();
209 let first_message_id = 5;
210 let folder_id = 6;
211 let is_recently_active = true;
212 let is_announcement_only = false;
213 let can_add_subscribers_group = CanAddSubscribersGroup::new();
214 let can_remove_subscribers_group = CanRemoveSubscribersGroup::new();
215 let can_administer_channel_group = CanAdministerChannelGroup::new();
216 let can_delete_any_message_group = CanDeleteAnyMessageGroup::new();
217 let can_delete_own_message_group = CanDeleteOwnMessageGroup::new();
218 let can_move_messages_out_of_channel_group = CanMoveMessagesOutOfChannelGroup::new();
219 let can_move_messages_within_channel_group = CanMoveMessagesWithinChannelGroup::new();
220 let can_send_message_group = CanSendMessageGroup::new();
221 let can_subscribe_group = CanSubscribeGroup::new();
222 let can_resolve_topics_group = CanResolveTopicsGroup::new();
223 let subscriber_count = 7;
224 let stream_weekly_traffic = 8;
225 let subscribers = [9u64];
226 let partial_subscribers = [10u64];
227
228 let never = NeverSubscribed::new()
229 .with_stream_id(stream_id)
230 .with_name(name)
231 .with_is_archived(is_archived)
232 .with_description(description)
233 .with_date_created(date_created)
234 .with_creator_id(creator_id)
235 .with_invite_only(invite_only)
236 .with_rendered_description(rendered_description)
237 .with_is_web_public(is_web_public)
238 .with_stream_post_policy(stream_post_policy)
239 .with_message_retention_days(message_retention_days)
240 .with_history_public_to_subscribers(history_public_to_subscribers)
241 .with_topics_policy(topics_policy)
242 .with_first_message_id(first_message_id)
243 .with_folder_id(folder_id)
244 .with_is_recently_active(is_recently_active)
245 .with_is_announcement_only(is_announcement_only)
246 .with_can_add_subscribers_group(&can_add_subscribers_group)
247 .with_can_remove_subscribers_group(&can_remove_subscribers_group)
248 .with_can_administer_channel_group(&can_administer_channel_group)
249 .with_can_delete_any_message_group(&can_delete_any_message_group)
250 .with_can_delete_own_message_group(&can_delete_own_message_group)
251 .with_can_move_messages_out_of_channel_group(&can_move_messages_out_of_channel_group)
252 .with_can_move_messages_within_channel_group(&can_move_messages_within_channel_group)
253 .with_can_send_message_group(&can_send_message_group)
254 .with_can_subscribe_group(&can_subscribe_group)
255 .with_can_resolve_topics_group(&can_resolve_topics_group)
256 .with_subscriber_count(subscriber_count)
257 .with_stream_weekly_traffic(stream_weekly_traffic)
258 .with_subscribers(subscribers.as_ref())
259 .with_partial_subscribers(partial_subscribers.as_ref());
260 let never_json = never.to_string();
261
262 assert_eq!(serde_json::to_string(&never).unwrap(), never_json);
263 assert_eq!(
264 serde_json::from_str::<NeverSubscribed>(&never_json).unwrap(),
265 never
266 );
267
268 assert_eq!(never.stream_id(), Some(stream_id));
269 assert_eq!(never.name(), Some(name));
270 assert_eq!(never.is_archived(), Some(is_archived));
271 assert_eq!(never.description(), Some(description));
272 assert_eq!(never.date_created(), Some(date_created));
273 assert_eq!(never.creator_id(), Some(creator_id));
274 assert_eq!(never.invite_only(), Some(invite_only));
275 assert_eq!(never.rendered_description(), Some(rendered_description));
276 assert_eq!(never.is_web_public(), Some(is_web_public));
277 assert_eq!(never.stream_post_policy(), Some(stream_post_policy));
278 assert_eq!(never.message_retention_days(), Some(message_retention_days));
279 assert_eq!(
280 never.history_public_to_subscribers(),
281 Some(history_public_to_subscribers)
282 );
283 assert_eq!(never.topics_policy(), Some(topics_policy));
284 assert_eq!(never.first_message_id(), Some(first_message_id));
285 assert_eq!(never.folder_id(), Some(folder_id));
286 assert_eq!(never.is_recently_active(), Some(is_recently_active));
287 assert_eq!(never.is_announcement_only(), Some(is_announcement_only));
288 assert_eq!(
289 never.can_add_subscribers_group(),
290 Some(&can_add_subscribers_group)
291 );
292 assert_eq!(
293 never.can_remove_subscribers_group(),
294 Some(&can_remove_subscribers_group)
295 );
296 assert_eq!(
297 never.can_administer_channel_group(),
298 Some(&can_administer_channel_group)
299 );
300 assert_eq!(
301 never.can_delete_any_message_group(),
302 Some(&can_delete_any_message_group)
303 );
304 assert_eq!(
305 never.can_delete_own_message_group(),
306 Some(&can_delete_own_message_group)
307 );
308 assert_eq!(
309 never.can_move_messages_out_of_channel_group(),
310 Some(&can_move_messages_out_of_channel_group)
311 );
312 assert_eq!(
313 never.can_move_messages_within_channel_group(),
314 Some(&can_move_messages_within_channel_group)
315 );
316 assert_eq!(
317 never.can_send_message_group(),
318 Some(&can_send_message_group)
319 );
320 assert_eq!(never.can_subscribe_group(), Some(&can_subscribe_group));
321 assert_eq!(
322 never.can_resolve_topics_group(),
323 Some(&can_resolve_topics_group)
324 );
325 assert_eq!(never.subscriber_count(), Some(subscriber_count));
326 assert_eq!(never.stream_weekly_traffic(), Some(stream_weekly_traffic));
327 assert_eq!(never.subscribers(), Some(subscribers.as_ref()));
328 assert_eq!(
329 never.partial_subscribers(),
330 Some(partial_subscribers.as_ref())
331 );
332 }
333}