Skip to main content

zulip_api/message/
user_settings.rs

1use serde::{Deserialize, Serialize};
2
3use crate::{
4    field_access, impl_default, impl_display, AutomaticallyFollowTopicsPolicy,
5    AutomaticallyUnmuteTopicsInMutedStreamsPolicy, ColorScheme, DemoteInactiveStreams,
6    DesktopIconCountDisplay, EmailAddressVisibility, Emojiset, RealmNameInEmailNotificationsPolicy,
7    ResolvedTopicNoticeAutoReadPolicy, UserListStyle, WebAnimateImagePreviews,
8    WebChannelDefaultView, WebHomeView, WebMarkReadOnScrollPolicy,
9    WebStreamUnreadsCountDisplayPolicy,
10};
11
12mod emojiset_choice;
13
14pub use emojiset_choice::UserSettingsEmojisetChoice;
15
16/// Represents the user's personal settings.
17///
18/// **Changes**: Removed `dense_mode` setting in Zulip 10.0 (feature level 364) as we now have `web_font_size_px` and `web_line_height_percent` settings for more control.  New in Zulip 5.0 (feature level 89). Previously, these settings appeared in the top-level object, where they are available for clients without the `user_settings_object` client capability for backwards-compatibility.
19///
20/// Modified from `openapi-generator-cli` output:
21///
22/// ```shell,no_build,no_run
23/// $ openapi-generator-cli generate -g rust -i ./zerver/openapi/zulip.yaml -o zulip-openapi --skip-validate-spec
24/// ```
25///
26/// ```text
27/// /*
28/// * Zulip REST API
29/// *
30/// * Powerful open source group chat
31/// *
32/// * The version of the OpenAPI document: 1.0.0
33/// *
34/// * Generated by: https://openapi-generator.tech
35/// */
36/// ```
37///
38/// See [zerver/openapi/zulip.yaml](https://github.com/zulip/zulip/blob/main/zerver/openapi/zulip.yaml) for the original OpenAPI configuration.
39///
40/// Configuration slightly modified to work with the Rust generator of [`openapi-generator-cli`](https://openapi-generator.tech).
41#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
42pub struct UserSettings {
43    #[serde(skip_serializing_if = "Option::is_none")]
44    twenty_four_hour_time: Option<bool>,
45    #[serde(skip_serializing_if = "Option::is_none")]
46    web_mark_read_on_scroll_policy: Option<WebMarkReadOnScrollPolicy>,
47    #[serde(skip_serializing_if = "Option::is_none")]
48    web_channel_default_view: Option<WebChannelDefaultView>,
49    #[serde(skip_serializing_if = "Option::is_none")]
50    starred_message_counts: Option<bool>,
51    #[serde(skip_serializing_if = "Option::is_none")]
52    receives_typing_notifications: Option<bool>,
53    #[serde(skip_serializing_if = "Option::is_none")]
54    web_suggest_update_timezone: Option<bool>,
55    #[serde(skip_serializing_if = "Option::is_none")]
56    fluid_layout_width: Option<bool>,
57    #[serde(skip_serializing_if = "Option::is_none")]
58    high_contrast_mode: Option<bool>,
59    #[serde(skip_serializing_if = "Option::is_none")]
60    web_font_size_px: Option<i32>,
61    #[serde(skip_serializing_if = "Option::is_none")]
62    web_line_height_percent: Option<i32>,
63    #[serde(skip_serializing_if = "Option::is_none")]
64    color_scheme: Option<ColorScheme>,
65    #[serde(skip_serializing_if = "Option::is_none")]
66    translate_emoticons: Option<bool>,
67    #[serde(skip_serializing_if = "Option::is_none")]
68    display_emoji_reaction_users: Option<bool>,
69    #[serde(skip_serializing_if = "Option::is_none")]
70    default_language: Option<String>,
71    #[serde(skip_serializing_if = "Option::is_none")]
72    web_home_view: Option<WebHomeView>,
73    #[serde(skip_serializing_if = "Option::is_none")]
74    web_escape_navigates_to_home_view: Option<bool>,
75    #[serde(skip_serializing_if = "Option::is_none")]
76    left_side_userlist: Option<bool>,
77    #[serde(skip_serializing_if = "Option::is_none")]
78    emojiset: Option<Emojiset>,
79    #[serde(skip_serializing_if = "Option::is_none")]
80    demote_inactive_streams: Option<DemoteInactiveStreams>,
81    #[serde(skip_serializing_if = "Option::is_none")]
82    user_list_style: Option<UserListStyle>,
83    #[serde(skip_serializing_if = "Option::is_none")]
84    web_animate_image_previews: Option<WebAnimateImagePreviews>,
85    #[serde(skip_serializing_if = "Option::is_none")]
86    web_stream_unreads_count_display_policy: Option<WebStreamUnreadsCountDisplayPolicy>,
87    #[serde(skip_serializing_if = "Option::is_none")]
88    hide_ai_features: Option<bool>,
89    #[serde(skip_serializing_if = "Option::is_none")]
90    web_left_sidebar_show_channel_folders: Option<bool>,
91    #[serde(skip_serializing_if = "Option::is_none")]
92    web_left_sidebar_unreads_count_summary: Option<bool>,
93    #[serde(skip_serializing_if = "Option::is_none")]
94    timezone: Option<String>,
95    #[serde(skip_serializing_if = "Option::is_none")]
96    enter_sends: Option<bool>,
97    #[serde(skip_serializing_if = "Option::is_none")]
98    enable_drafts_synchronization: Option<bool>,
99    #[serde(skip_serializing_if = "Option::is_none")]
100    enable_stream_desktop_notifications: Option<bool>,
101    #[serde(skip_serializing_if = "Option::is_none")]
102    enable_stream_email_notifications: Option<bool>,
103    #[serde(skip_serializing_if = "Option::is_none")]
104    enable_stream_push_notifications: Option<bool>,
105    #[serde(skip_serializing_if = "Option::is_none")]
106    enable_stream_audible_notifications: Option<bool>,
107    #[serde(skip_serializing_if = "Option::is_none")]
108    notification_sound: Option<String>,
109    #[serde(skip_serializing_if = "Option::is_none")]
110    enable_desktop_notifications: Option<bool>,
111    #[serde(skip_serializing_if = "Option::is_none")]
112    enable_sounds: Option<bool>,
113    #[serde(skip_serializing_if = "Option::is_none")]
114    enable_followed_topic_desktop_notifications: Option<bool>,
115    #[serde(skip_serializing_if = "Option::is_none")]
116    enable_followed_topic_email_notifications: Option<bool>,
117    #[serde(skip_serializing_if = "Option::is_none")]
118    enable_followed_topic_push_notifications: Option<bool>,
119    #[serde(skip_serializing_if = "Option::is_none")]
120    enable_followed_topic_audible_notifications: Option<bool>,
121    #[serde(skip_serializing_if = "Option::is_none")]
122    email_notifications_batching_period_seconds: Option<i32>,
123    #[serde(skip_serializing_if = "Option::is_none")]
124    enable_offline_email_notifications: Option<bool>,
125    #[serde(skip_serializing_if = "Option::is_none")]
126    enable_offline_push_notifications: Option<bool>,
127    #[serde(skip_serializing_if = "Option::is_none")]
128    enable_online_push_notifications: Option<bool>,
129    #[serde(skip_serializing_if = "Option::is_none")]
130    enable_digest_emails: Option<bool>,
131    #[serde(skip_serializing_if = "Option::is_none")]
132    enable_marketing_emails: Option<bool>,
133    #[serde(skip_serializing_if = "Option::is_none")]
134    enable_login_emails: Option<bool>,
135    #[serde(skip_serializing_if = "Option::is_none")]
136    message_content_in_email_notifications: Option<bool>,
137    #[serde(skip_serializing_if = "Option::is_none")]
138    pm_content_in_desktop_notifications: Option<bool>,
139    #[serde(skip_serializing_if = "Option::is_none")]
140    wildcard_mentions_notify: Option<bool>,
141    #[serde(skip_serializing_if = "Option::is_none")]
142    enable_followed_topic_wildcard_mentions_notify: Option<bool>,
143    #[serde(skip_serializing_if = "Option::is_none")]
144    desktop_icon_count_display: Option<DesktopIconCountDisplay>,
145    #[serde(skip_serializing_if = "Option::is_none")]
146    realm_name_in_email_notifications_policy: Option<RealmNameInEmailNotificationsPolicy>,
147    #[serde(skip_serializing_if = "Option::is_none")]
148    automatically_follow_topics_policy: Option<AutomaticallyFollowTopicsPolicy>,
149    #[serde(skip_serializing_if = "Option::is_none")]
150    automatically_unmute_topics_in_muted_streams_policy:
151        Option<AutomaticallyUnmuteTopicsInMutedStreamsPolicy>,
152    #[serde(skip_serializing_if = "Option::is_none")]
153    automatically_follow_topics_where_mentioned: Option<bool>,
154    #[serde(skip_serializing_if = "Option::is_none")]
155    resolved_topic_notice_auto_read_policy: Option<ResolvedTopicNoticeAutoReadPolicy>,
156    #[serde(skip_serializing_if = "Option::is_none")]
157    presence_enabled: Option<bool>,
158    #[serde(skip_serializing_if = "Option::is_none")]
159    available_notification_sounds: Option<Vec<String>>,
160    #[serde(skip_serializing_if = "Option::is_none")]
161    emojiset_choices: Option<Vec<UserSettingsEmojisetChoice>>,
162    #[serde(skip_serializing_if = "Option::is_none")]
163    send_private_typing_notifications: Option<bool>,
164    #[serde(skip_serializing_if = "Option::is_none")]
165    send_stream_typing_notifications: Option<bool>,
166    #[serde(skip_serializing_if = "Option::is_none")]
167    send_read_receipts: Option<bool>,
168    #[serde(skip_serializing_if = "Option::is_none")]
169    allow_private_data_export: Option<bool>,
170    #[serde(skip_serializing_if = "Option::is_none")]
171    email_address_visibility: Option<EmailAddressVisibility>,
172    #[serde(skip_serializing_if = "Option::is_none")]
173    web_navigate_to_sent_message: Option<bool>,
174}
175
176impl UserSettings {
177    /// Creates a new [UserSettings].
178    pub const fn new() -> Self {
179        Self {
180            twenty_four_hour_time: None,
181            web_mark_read_on_scroll_policy: None,
182            web_channel_default_view: None,
183            starred_message_counts: None,
184            receives_typing_notifications: None,
185            web_suggest_update_timezone: None,
186            fluid_layout_width: None,
187            high_contrast_mode: None,
188            web_font_size_px: None,
189            web_line_height_percent: None,
190            color_scheme: None,
191            translate_emoticons: None,
192            display_emoji_reaction_users: None,
193            default_language: None,
194            web_home_view: None,
195            web_escape_navigates_to_home_view: None,
196            left_side_userlist: None,
197            emojiset: None,
198            demote_inactive_streams: None,
199            user_list_style: None,
200            web_animate_image_previews: None,
201            web_stream_unreads_count_display_policy: None,
202            hide_ai_features: None,
203            web_left_sidebar_show_channel_folders: None,
204            web_left_sidebar_unreads_count_summary: None,
205            timezone: None,
206            enter_sends: None,
207            enable_drafts_synchronization: None,
208            enable_stream_desktop_notifications: None,
209            enable_stream_email_notifications: None,
210            enable_stream_push_notifications: None,
211            enable_stream_audible_notifications: None,
212            notification_sound: None,
213            enable_desktop_notifications: None,
214            enable_sounds: None,
215            enable_followed_topic_desktop_notifications: None,
216            enable_followed_topic_email_notifications: None,
217            enable_followed_topic_push_notifications: None,
218            enable_followed_topic_audible_notifications: None,
219            email_notifications_batching_period_seconds: None,
220            enable_offline_email_notifications: None,
221            enable_offline_push_notifications: None,
222            enable_online_push_notifications: None,
223            enable_digest_emails: None,
224            enable_marketing_emails: None,
225            enable_login_emails: None,
226            message_content_in_email_notifications: None,
227            pm_content_in_desktop_notifications: None,
228            wildcard_mentions_notify: None,
229            enable_followed_topic_wildcard_mentions_notify: None,
230            desktop_icon_count_display: None,
231            realm_name_in_email_notifications_policy: None,
232            automatically_follow_topics_policy: None,
233            automatically_unmute_topics_in_muted_streams_policy: None,
234            automatically_follow_topics_where_mentioned: None,
235            resolved_topic_notice_auto_read_policy: None,
236            presence_enabled: None,
237            available_notification_sounds: None,
238            emojiset_choices: None,
239            send_private_typing_notifications: None,
240            send_stream_typing_notifications: None,
241            send_read_receipts: None,
242            allow_private_data_export: None,
243            email_address_visibility: None,
244            web_navigate_to_sent_message: None,
245        }
246    }
247}
248
249field_access! {
250    UserSettings {
251        /// Whether time should be [displayed in 24-hour notation](https://zulip.com/help/change-the-time-format).
252        ///
253        /// A `null` value indicates that the client should use the default time format for the user's locale.
254        ///
255        /// **Changes**: Prior to Zulip 11.0 (feature level 408),
256        /// `null` was not a valid value for this setting.
257        /// Note that it was not possible to actually set the time format to `null` at this feature level.
258        twenty_four_hour_time: option { bool },
259        /// Whether or not to mark messages as read when the user scrolls through their feed.
260        web_mark_read_on_scroll_policy: option { WebMarkReadOnScrollPolicy },
261        /// Web/desktop app setting controlling the default navigation behavior when clicking on a channel link.
262        web_channel_default_view: option { WebChannelDefaultView },
263        /// Whether clients should display the [number of starred messages](https://zulip.com/help/star-a-message#display-the-number-of-starred-messages).
264        starred_message_counts: option { bool },
265        /// Whether the user is configured to receive typing notifications from other users.
266        ///
267        /// The server will only deliver typing notifications events to users who for whom this is enabled.
268        ///
269        /// **Changes**: New in Zulip 9.0 (feature level 253). Previously, there were only options to disable sending typing notifications.
270        receives_typing_notifications: option { bool },
271        /// Whether the user should be shown an alert,
272        /// offering to update their [profile time zone](https://zulip.com/help/change-your-timezone),
273        /// when the time displayed for the profile time zone differs from the current time displayed by the time zone configured on their device.
274        ///
275        /// **Changes**: New in Zulip 10.0 (feature level 329).
276        web_suggest_update_timezone: option { bool },
277        /// Whether to use the [maximum available screen width](https://zulip.com/help/enable-full-width-display) for the web app's center panel (message feed, recent conversations) on wide screens.
278        fluid_layout_width: option { bool },
279        /// This setting is reserved for use to control variations in Zulip's design to help visually impaired users.
280        high_contrast_mode: option { bool },
281        /// User-configured primary `font-size` for the web application, in pixels.
282        ///
283        /// **Changes**: New in Zulip 9.0 (feature level 245). Previously, font size was only adjustable via browser zoom. Note that this setting was not fully implemented at this feature level.
284        web_font_size_px: option { i32 },
285        /// User-configured primary `line-height` for the web application, in percent, so a value of 120 represents a `line-height` of 1.2.
286        ///
287        /// **Changes**: New in Zulip 9.0 (feature level 245).
288        /// Previously, line height was not user-configurable.
289        /// Note that this setting was not fully implemented at this feature level.
290        web_line_height_percent: option { i32 },
291        /// Controls which [color theme](/help/dark-theme) to use.
292        color_scheme: option { ColorScheme },
293        /// Whether to [translate emoticons to emoji](/help/configure-emoticon-translations) in messages the user sends.
294        translate_emoticons: option { bool },
295        /// Whether to display the names of reacting users on a message.
296        ///
297        /// When enabled, clients should display the names of reacting users, rather than a count, for messages with few total reactions.
298        /// The ideal cutoff may depend on the space available for displaying reactions;
299        /// the official web application displays names when 3 or fewer total reactions are present with this setting enabled.
300        ///
301        /// **Changes**: New in Zulip 6.0 (feature level 125).
302        display_emoji_reaction_users: option { bool },
303        /// The [home view](https://zulip.com/help/configure-home-view) used when opening a new Zulip web app window or hitting the `Esc` keyboard shortcut repeatedly.
304        web_home_view: option { WebHomeView },
305        /// Whether the escape key navigates to the [configured home view](https://zulip.com/help/configure-home-view).
306        ///
307        /// **Changes**: New in Zulip 8.0 (feature level 219). Previously, this was called `escape_navigates_to_default_view`, which was new in Zulip 5.0 (feature level 107).
308        web_escape_navigates_to_home_view: option { bool },
309        /// Whether the users list on left sidebar in narrow windows.
310        ///
311        /// This feature is not heavily used and is likely to be reworked.
312        left_side_userlist: option { bool },
313        /// The user's configured [emoji set](https://zulip.com/help/emoji-and-emoticons#use-emoticons), used to display emoji to the user everywhere they appear in the UI.
314        emojiset: option { Emojiset },
315        /// Whether to [hide inactive channels](https://zulip.com/help/manage-inactive-channels) in the left sidebar.
316        demote_inactive_streams: option { DemoteInactiveStreams },
317        /// The style selected by the user for the right sidebar user list.
318        user_list_style: option { UserListStyle },
319        /// Controls how animated images should be played in the message feed in the web/desktop application.
320        web_animate_image_previews: option { WebAnimateImagePreviews },
321        /// Configuration for which channels should be displayed with a numeric unread count in the left sidebar.
322        web_stream_unreads_count_display_policy: option { WebStreamUnreadsCountDisplayPolicy },
323        /// Controls whether user wants AI features like topic summarization to be hidden in all Zulip clients.
324        ///
325        /// **Changes**: New in Zulip 10.0 (feature level 350).
326        hide_ai_features: option { bool },
327        /// Determines whether the web/desktop application's left sidebar displays any channel folders configured by the organization.
328        ///
329        /// **Changes**: New in Zulip 11.0 (feature level 411).
330        web_left_sidebar_show_channel_folders: option { bool },
331        /// Determines whether the web/desktop application's left sidebar displays the unread message count summary.
332        ///
333        /// **Changes**: New in Zulip 11.0 (feature level 398).
334        web_left_sidebar_unreads_count_summary: option { bool },
335        /// Whether the user setting for [sending on pressing Enter](https://zulip.com/help/configure-send-message-keys) in the compose box is enabled.
336        enter_sends: option { bool },
337        /// A boolean parameter to control whether synchronizing drafts is enabled for the user.
338        ///
339        /// When synchronization is disabled, all drafts stored in the server will be automatically deleted from the server.
340        ///
341        /// This does not do anything (like sending events) to delete local copies of drafts stored in clients.
342        enable_drafts_synchronization: option { bool },
343        /// Enable visual desktop notifications for channel messages.
344        enable_stream_desktop_notifications: option { bool },
345        /// Enable email notifications for channel messages.
346        enable_stream_email_notifications: option { bool },
347        /// Enable mobile notifications for channel messages.
348        enable_stream_push_notifications: option { bool },
349        /// Enable audible desktop notifications for channel messages.
350        enable_stream_audible_notifications: option { bool },
351        /// Enable visual desktop notifications for direct messages and @-mentions.
352        enable_desktop_notifications: option { bool },
353        /// Enable audible desktop notifications for direct messages and @-mentions.
354        enable_sounds: option { bool },
355        /// Enable visual desktop notifications for messages sent to followed topics.  **Changes**: New in Zulip 8.0 (feature level 189).
356        enable_followed_topic_desktop_notifications: option { bool },
357        /// Enable email notifications for messages sent to followed topics.  **Changes**: New in Zulip 8.0 (feature level 189).
358        enable_followed_topic_email_notifications: option { bool },
359        /// Enable push notifications for messages sent to followed topics.  **Changes**: New in Zulip 8.0 (feature level 189).
360        enable_followed_topic_push_notifications: option { bool },
361        /// Enable audible desktop notifications for messages sent to followed topics.  **Changes**: New in Zulip 8.0 (feature level 189).
362        enable_followed_topic_audible_notifications: option { bool },
363        /// The duration (in seconds) for which the server should wait to batch email notifications before sending them.
364        email_notifications_batching_period_seconds: option { i32 },
365        /// Enable email notifications for direct messages and @-mentions received when the user is offline.
366        enable_offline_email_notifications: option { bool },
367        /// Enable mobile notification for direct messages and @-mentions received when the user is offline.
368        enable_offline_push_notifications: option { bool },
369        /// Enable mobile notification for direct messages and @-mentions received when the user is online.
370        enable_online_push_notifications: option { bool },
371        /// Enable digest emails when the user is away.
372        enable_digest_emails: option { bool },
373        /// Enable marketing emails. Has no function outside Zulip Cloud.
374        enable_marketing_emails: option { bool },
375        /// Enable email notifications for new logins to account.
376        enable_login_emails: option { bool },
377        /// Include the message's content in email notifications for new messages.
378        message_content_in_email_notifications: option { bool },
379        /// Include content of direct messages in desktop notifications.
380        pm_content_in_desktop_notifications: option { bool },
381        /// Whether wildcard mentions (E.g. @**all**) should send notifications like a personal mention.
382        wildcard_mentions_notify: option { bool },
383        /// Whether wildcard mentions (e.g., @**all**) in messages sent to followed topics should send notifications like a personal mention.
384        ///
385        /// **Changes**: New in Zulip 8.0 (feature level 189).
386        enable_followed_topic_wildcard_mentions_notify: option { bool },
387        /// Unread count badge (appears in desktop sidebar and browser tab)
388        desktop_icon_count_display: option { DesktopIconCountDisplay },
389        /// Whether to [include organization name in subject of message notification emails](https://zulip.com/help/email-notifications#include-organization-name-in-subject-line).
390        realm_name_in_email_notifications_policy: option { RealmNameInEmailNotificationsPolicy },
391        /// Which [topics to follow automatically](https://zulip.com/help/mute-a-topic).
392        automatically_follow_topics_policy: option { AutomaticallyFollowTopicsPolicy },
393        /// Which [topics to unmute automatically in muted channels](https://zulip.com/help/mute-a-topic).
394        automatically_unmute_topics_in_muted_streams_policy: option { AutomaticallyUnmuteTopicsInMutedStreamsPolicy },
395        /// Whether the server will automatically mark the user as following topics where the user is mentioned.
396        ///
397        /// **Changes**: New in Zulip 8.0 (feature level 235).
398        automatically_follow_topics_where_mentioned: option { bool },
399        /// Controls whether the resolved-topic notices are marked as read.
400        resolved_topic_notice_auto_read_policy: option { ResolvedTopicNoticeAutoReadPolicy },
401        /// Display the presence status to other users when online.
402        presence_enabled: option { bool },
403        /// Whether the user has chosen to send [typing notifications](https://zulip.com/help/typing-notifications) when composing direct messages.
404        ///
405        /// The client should send typing notifications for direct messages if and only if this setting is enabled.
406        ///
407        /// **Changes**: New in Zulip 5.0 (feature level 105).
408        send_private_typing_notifications: option { bool },
409        /// Whether the user has chosen to send [typing notifications](https://zulip.com/help/typing-notifications) when composing channel messages.
410        ///
411        /// The client should send typing notifications for channel messages if and only if this setting is enabled.
412        ///
413        /// **Changes**: New in Zulip 5.0 (feature level 105).
414        send_stream_typing_notifications: option { bool },
415        /// Whether other users are allowed to see whether you've read messages.
416        ///
417        /// **Changes**: New in Zulip 5.0 (feature level 105).
418        send_read_receipts: option { bool },
419        /// Whether organization administrators are allowed to export your private data.
420        ///
421        /// **Changes**: New in Zulip 10.0 (feature level 293).
422        allow_private_data_export: option { bool },
423        /// The [policy](https://zulip.com/api/roles-and-permissions#permission-levels) for
424        /// [which other users](https://zulip.com/help/configure-email-visibility) in this organization can see the user's real email address.
425        email_address_visibility: option { EmailAddressVisibility },
426        /// Web/desktop app setting for whether the user's view should automatically go to the conversation where they sent a message.
427        ///
428        /// **Changes**: New in Zulip 9.0 (feature level 268). Previously, this behavior was not configurable.
429        web_navigate_to_sent_message: option { bool },
430    }
431}
432
433field_access! {
434    UserSettings {
435        /// What [default language](https://zulip.com/help/change-your-language) to use for the account.
436        ///
437        /// This controls both the Zulip UI as well as email notifications sent to the user.
438        ///
439        /// The value needs to be a standard language code that the Zulip server has translation data for; for example, `\"en\"` for English or `\"de\"` for German.
440        default_language: option_cow_deref { str, String },
441        /// Notification sound name.
442        notification_sound: option_cow_deref { str, String },
443        /// The IANA identifier of the user's [profile time zone](https://zulip.com/help/change-your-timezone), which is used primarily to display the user's local time to other users.
444        timezone: option_cow_deref { str, String },
445        /// Array containing the names of the notification sound options supported by this Zulip server.
446        ///
447        /// Only relevant to support UI for configuring notification sounds.
448        available_notification_sounds: option_cow_deref { [String], Vec<String> },
449        /// Array of dictionaries where each dictionary describes an emoji set supported by this version of the Zulip server.
450        ///
451        /// Only relevant to clients with configuration UI for choosing an emoji set; the currently selected emoji set is available in the `emojiset` key.
452        ///
453        /// See [PATCH /settings](https://zulip.com/api/update-settings) for details on the meaning of this setting.
454        emojiset_choices: option_cow_deref { [UserSettingsEmojisetChoice], Vec<UserSettingsEmojisetChoice> },
455    }
456}
457
458impl_default!(UserSettings);
459impl_display!(UserSettings);