Piotr OsiewiczRust 1.85 (#25272)e4e758d1 year agoHistory
172 lines · 4.6 KB · Rust
RawDownload
use gpui::Pixels;use schemars::JsonSchema;use serde::{Deserialize, Serialize};use settings::{Settings, SettingsSources};use workspace::dock::DockPosition; #[derive(Deserialize, Debug)]pub struct CollaborationPanelSettings {    pub button: bool,    pub dock: DockPosition,    pub default_width: Pixels,} #[derive(Clone, Copy, Default, Serialize, JsonSchema, Debug)]#[serde(rename_all = "snake_case")]pub enum ChatPanelButton {    Never,    Always,    #[default]    WhenInCall,} impl<'de> Deserialize<'de> for ChatPanelButton {    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>    where        D: serde::Deserializer<'de>,    {        struct Visitor;         impl serde::de::Visitor<'_> for Visitor {            type Value = ChatPanelButton;             fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {                write!(                    f,                    r#"a boolean or one of "never", "always", "when_in_call""#                )            }             fn visit_bool<E>(self, b: bool) -> Result<Self::Value, E>            where                E: serde::de::Error,            {                match b {                    false => Ok(ChatPanelButton::Never),                    true => Ok(ChatPanelButton::Always),                }            }             fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>            where                E: serde::de::Error,            {                match s {                    "never" => Ok(ChatPanelButton::Never),                    "always" => Ok(ChatPanelButton::Always),                    "when_in_call" => Ok(ChatPanelButton::WhenInCall),                    _ => Err(E::unknown_variant(s, &["never", "always", "when_in_call"])),                }            }        }         deserializer.deserialize_any(Visitor)    }} #[derive(Deserialize, Debug)]pub struct ChatPanelSettings {    pub button: ChatPanelButton,    pub dock: DockPosition,    pub default_width: Pixels,} #[derive(Clone, Default, Serialize, Deserialize, JsonSchema, Debug)]pub struct ChatPanelSettingsContent {    /// When to show the panel button in the status bar.    ///    /// Default: only when in a call    pub button: Option<ChatPanelButton>,    /// Where to dock the panel.    ///    /// Default: right    pub dock: Option<DockPosition>,    /// Default width of the panel in pixels.    ///    /// Default: 240    pub default_width: Option<f32>,} #[derive(Deserialize, Debug)]pub struct NotificationPanelSettings {    pub button: bool,    pub dock: DockPosition,    pub default_width: Pixels,} #[derive(Clone, Default, Serialize, Deserialize, JsonSchema, Debug)]pub struct PanelSettingsContent {    /// Whether to show the panel button in the status bar.    ///    /// Default: true    pub button: Option<bool>,    /// Where to dock the panel.    ///    /// Default: left    pub dock: Option<DockPosition>,    /// Default width of the panel in pixels.    ///    /// Default: 240    pub default_width: Option<f32>,} #[derive(Clone, Default, Serialize, Deserialize, JsonSchema, Debug)]pub struct MessageEditorSettings {    /// Whether to automatically replace emoji shortcodes with emoji characters.    /// For example: typing `:wave:` gets replaced with `👋`.    ///    /// Default: false    pub auto_replace_emoji_shortcode: Option<bool>,} impl Settings for CollaborationPanelSettings {    const KEY: Option<&'static str> = Some("collaboration_panel");     type FileContent = PanelSettingsContent;     fn load(        sources: SettingsSources<Self::FileContent>,        _: &mut gpui::App,    ) -> anyhow::Result<Self> {        sources.json_merge()    }} impl Settings for ChatPanelSettings {    const KEY: Option<&'static str> = Some("chat_panel");     type FileContent = ChatPanelSettingsContent;     fn load(        sources: SettingsSources<Self::FileContent>,        _: &mut gpui::App,    ) -> anyhow::Result<Self> {        sources.json_merge()    }} impl Settings for NotificationPanelSettings {    const KEY: Option<&'static str> = Some("notification_panel");     type FileContent = PanelSettingsContent;     fn load(        sources: SettingsSources<Self::FileContent>,        _: &mut gpui::App,    ) -> anyhow::Result<Self> {        sources.json_merge()    }} impl Settings for MessageEditorSettings {    const KEY: Option<&'static str> = Some("message_editor");     type FileContent = MessageEditorSettings;     fn load(        sources: SettingsSources<Self::FileContent>,        _: &mut gpui::App,    ) -> anyhow::Result<Self> {        sources.json_merge()    }}