1use serde::{Deserialize, Serialize};
2
3use crate::{field_access, impl_default, impl_display, BotType, ProfileData, Role};
4
5#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
29pub struct CrossRealmBot {
30 #[serde(skip_serializing_if = "Option::is_none")]
31 user_id: Option<u64>,
32 #[serde(skip_serializing_if = "Option::is_none")]
33 delivery_email: Option<String>,
34 #[serde(skip_serializing_if = "Option::is_none")]
35 email: Option<String>,
36 #[serde(skip_serializing_if = "Option::is_none")]
37 full_name: Option<String>,
38 #[serde(skip_serializing_if = "Option::is_none")]
39 date_joined: Option<String>,
40 #[serde(skip_serializing_if = "Option::is_none")]
41 is_active: Option<bool>,
42 #[serde(skip_serializing_if = "Option::is_none")]
43 is_owner: Option<bool>,
44 #[serde(skip_serializing_if = "Option::is_none")]
45 is_admin: Option<bool>,
46 #[serde(skip_serializing_if = "Option::is_none")]
47 is_guest: Option<bool>,
48 #[serde(skip_serializing_if = "Option::is_none")]
49 is_bot: Option<bool>,
50 #[serde(skip_serializing_if = "Option::is_none")]
51 bot_type: Option<BotType>,
52 #[serde(skip_serializing_if = "Option::is_none")]
53 bot_owner_id: Option<u64>,
54 #[serde(skip_serializing_if = "Option::is_none")]
55 role: Option<Role>,
56 #[serde(skip_serializing_if = "Option::is_none")]
57 timezone: Option<String>,
58 #[serde(skip_serializing_if = "Option::is_none")]
59 avatar_url: Option<String>,
60 #[serde(skip_serializing_if = "Option::is_none")]
61 avatar_version: Option<u64>,
62 #[serde(skip_serializing_if = "Option::is_none")]
63 profile_data: Option<ProfileData>,
64 #[serde(skip_serializing_if = "Option::is_none")]
65 is_system_bot: Option<bool>,
66}
67
68impl CrossRealmBot {
69 pub const fn new() -> Self {
71 CrossRealmBot {
72 user_id: None,
73 delivery_email: None,
74 email: None,
75 full_name: None,
76 date_joined: None,
77 is_active: None,
78 is_owner: None,
79 is_admin: None,
80 is_guest: None,
81 is_bot: None,
82 bot_type: None,
83 bot_owner_id: None,
84 role: None,
85 timezone: None,
86 avatar_url: None,
87 avatar_version: None,
88 profile_data: None,
89 is_system_bot: None,
90 }
91 }
92}
93
94field_access! {
95 CrossRealmBot {
96 user_id: option { u64 },
98 is_active: option { bool },
100 is_owner: option { bool },
102 is_admin: option { bool },
104 is_guest: option { bool },
106 is_bot: option { bool },
108 bot_type: option { BotType },
110 bot_owner_id: option { u64 },
119 role: option { Role },
121 avatar_version: option { u64 },
125 is_system_bot: option { bool },
131 }
132}
133
134field_access! {
135 CrossRealmBot {
136 delivery_email: option_cow_deref { str, String },
147 email: option_cow_deref { str, String },
152 full_name: option_cow_deref { str, String },
154 date_joined: option_cow_deref { str, String },
156 timezone: option_cow_deref { str, String },
159 avatar_url: option_cow_deref { str, String },
161 }
162}
163
164field_access! {
165 CrossRealmBot {
166 profile_data: option_cow_ref { ProfileData },
168 }
169}
170
171impl_default!(CrossRealmBot);
172impl_display!(CrossRealmBot);
173
174#[cfg(test)]
175mod tests {
176 use super::*;
177
178 #[test]
179 fn test_cross_realm_bot() {
180 let user_id = 1;
181 let delivery_email = "test-delivery@example.com";
182 let email = "test@example.com";
183 let full_name = "full name";
184 let date_joined = "2001/01/01";
185 let is_active = true;
186 let is_owner = false;
187 let is_admin = true;
188 let is_guest = false;
189 let is_bot = true;
190 let bot_type = BotType::new();
191 let bot_owner_id = 2;
192 let role = Role::new();
193 let timezone = "UTC";
194 let avatar_url = "https://example.com/avatar";
195 let avatar_version = 3;
196 let profile_data = ProfileData::new();
197 let is_system_bot = false;
198
199 let bot = CrossRealmBot::new()
200 .with_user_id(user_id)
201 .with_delivery_email(delivery_email)
202 .with_email(email)
203 .with_full_name(full_name)
204 .with_date_joined(date_joined)
205 .with_is_active(is_active)
206 .with_is_owner(is_owner)
207 .with_is_admin(is_admin)
208 .with_is_guest(is_guest)
209 .with_is_bot(is_bot)
210 .with_bot_type(bot_type)
211 .with_bot_owner_id(bot_owner_id)
212 .with_role(role)
213 .with_timezone(timezone)
214 .with_avatar_url(avatar_url)
215 .with_avatar_version(avatar_version)
216 .with_profile_data(&profile_data)
217 .with_is_system_bot(is_system_bot);
218 let bot_json = bot.to_string();
219
220 assert_eq!(serde_json::to_string(&bot).unwrap(), bot_json);
221 assert_eq!(
222 serde_json::from_str::<CrossRealmBot>(&bot_json).unwrap(),
223 bot
224 );
225
226 assert_eq!(bot.user_id(), Some(user_id));
227 assert_eq!(bot.delivery_email(), Some(delivery_email));
228 assert_eq!(bot.email(), Some(email));
229 assert_eq!(bot.full_name(), Some(full_name));
230 assert_eq!(bot.date_joined(), Some(date_joined));
231 assert_eq!(bot.is_active(), Some(is_active));
232 assert_eq!(bot.is_owner(), Some(is_owner));
233 assert_eq!(bot.is_admin(), Some(is_admin));
234 assert_eq!(bot.is_guest(), Some(is_guest));
235 assert_eq!(bot.is_bot(), Some(is_bot));
236 assert_eq!(bot.bot_type(), Some(bot_type));
237 assert_eq!(bot.bot_owner_id(), Some(bot_owner_id));
238 assert_eq!(bot.role(), Some(role));
239 assert_eq!(bot.timezone(), Some(timezone));
240 assert_eq!(bot.avatar_url(), Some(avatar_url));
241 assert_eq!(bot.avatar_version(), Some(avatar_version));
242 assert_eq!(bot.profile_data(), Some(&profile_data));
243 assert_eq!(bot.is_system_bot(), Some(is_system_bot));
244 }
245}