From c2a1829d4aedec6fb48c4d5924c0091632d24c8c Mon Sep 17 00:00:00 2001 From: Conrad Irwin Date: Mon, 15 Sep 2025 22:52:03 -0600 Subject: [PATCH] No more options --- crates/audio/src/audio_settings.rs | 16 +-- crates/git_hosting_providers/src/settings.rs | 20 ++-- crates/language/src/language_settings.rs | 99 ++++++++++--------- crates/multi_buffer/src/multi_buffer.rs | 2 +- crates/settings/src/base_keymap_setting.rs | 4 +- crates/settings/src/settings_store.rs | 60 ++++++----- crates/theme/src/settings.rs | 43 ++++---- crates/title_bar/src/title_bar_settings.rs | 2 +- .../vim_mode_setting/src/vim_mode_setting.rs | 8 +- crates/zlog_settings/src/zlog_settings.rs | 8 +- 10 files changed, 131 insertions(+), 131 deletions(-) diff --git a/crates/audio/src/audio_settings.rs b/crates/audio/src/audio_settings.rs index 0c66cf08c4c0959c65df6b3554de8012137d897a..28f97c4b4df6f8741c3fd0552ed883cc7a8838a3 100644 --- a/crates/audio/src/audio_settings.rs +++ b/crates/audio/src/audio_settings.rs @@ -4,7 +4,7 @@ use gpui::App; use settings::{Settings, SettingsStore}; use util::MergeFrom as _; -#[derive(Clone, Default, Debug)] +#[derive(Clone, Debug)] pub struct AudioSettings { /// Opt into the new audio system. pub rodio_audio: bool, // default is false @@ -23,13 +23,13 @@ pub struct AudioSettings { /// Configuration of audio in Zed impl Settings for AudioSettings { - fn from_default(content: &settings::SettingsContent, _cx: &mut App) -> Option { - let audio = &content.audio.as_ref()?; - Some(AudioSettings { - control_input_volume: audio.control_input_volume?, - control_output_volume: audio.control_output_volume?, - rodio_audio: audio.rodio_audio?, - }) + fn from_defaults(content: &settings::SettingsContent, _cx: &mut App) -> Self { + let audio = &content.audio.as_ref().unwrap(); + AudioSettings { + control_input_volume: audio.control_input_volume.unwrap(), + control_output_volume: audio.control_output_volume.unwrap(), + rodio_audio: audio.rodio_audio.unwrap(), + } } fn refine(&mut self, content: &settings::SettingsContent, _cx: &mut App) { diff --git a/crates/git_hosting_providers/src/settings.rs b/crates/git_hosting_providers/src/settings.rs index e2c33c8f2802dd3ad28ad6d34c9c214c63f02633..fd706adf73cfe5890dac4133fd5be1d4ac967a05 100644 --- a/crates/git_hosting_providers/src/settings.rs +++ b/crates/git_hosting_providers/src/settings.rs @@ -2,12 +2,7 @@ use std::sync::Arc; use git::GitHostingProviderRegistry; use gpui::App; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use settings::{ - GitHostingProviderConfig, GitHostingProviderKind, Settings, SettingsKey, SettingsStore, - SettingsUi, -}; +use settings::{GitHostingProviderConfig, GitHostingProviderKind, Settings, SettingsStore}; use url::Url; use util::ResultExt as _; @@ -57,19 +52,16 @@ fn update_git_hosting_providers_from_settings(cx: &mut App) { provider_registry.set_setting_providers(iter); } -#[derive(Default, Debug, Clone, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey)] -#[settings_key(None)] +#[derive(Debug, Clone)] pub struct GitHostingProviderSettings { - /// The list of custom Git hosting providers. - #[serde(default)] pub git_hosting_providers: Vec, } impl Settings for GitHostingProviderSettings { - fn from_default(content: &settings::SettingsContent, _cx: &mut App) -> Option { - Some(Self { - git_hosting_providers: content.git_hosting_providers.clone()?, - }) + fn from_defaults(content: &settings::SettingsContent, _cx: &mut App) -> Self { + Self { + git_hosting_providers: content.git_hosting_providers.clone().unwrap(), + } } fn refine(&mut self, content: &settings::SettingsContent, _: &mut App) { diff --git a/crates/language/src/language_settings.rs b/crates/language/src/language_settings.rs index 5fb4291bdc045e4fee0cbd68103329cde51932bc..f2c43cb34303f50c5cd6c8e76c74ef25811bc262 100644 --- a/crates/language/src/language_settings.rs +++ b/crates/language/src/language_settings.rs @@ -374,45 +374,49 @@ fn merge_with_editorconfig(settings: &mut LanguageSettings, cfg: &EditorconfigPr } impl settings::Settings for AllLanguageSettings { - fn from_default(content: &settings::SettingsContent, cx: &mut App) -> Option { + fn from_defaults(content: &settings::SettingsContent, _cx: &mut App) -> Self { let all_languages = &content.project.all_languages; - let defaults = &all_languages.defaults; + let defaults = all_languages.defaults.clone(); let default_language_settings = LanguageSettings { - tab_size: defaults.tab_size?, - hard_tabs: defaults.hard_tabs?, - soft_wrap: defaults.soft_wrap?, - preferred_line_length: defaults.preferred_line_length?, - show_wrap_guides: defaults.show_wrap_guides?, - wrap_guides: defaults.wrap_guides.clone()?, - indent_guides: defaults.indent_guides.clone()?, - format_on_save: defaults.format_on_save.clone()?, - remove_trailing_whitespace_on_save: defaults.remove_trailing_whitespace_on_save?, - ensure_final_newline_on_save: defaults.ensure_final_newline_on_save?, - formatter: defaults.formatter.clone()?, - prettier: defaults.prettier.clone()?, - jsx_tag_auto_close: defaults.jsx_tag_auto_close.clone()?, - enable_language_server: defaults.enable_language_server?, - language_servers: defaults.language_servers.clone()?, - allow_rewrap: defaults.allow_rewrap?, - show_edit_predictions: defaults.show_edit_predictions?, - edit_predictions_disabled_in: defaults.edit_predictions_disabled_in.clone()?, - show_whitespaces: defaults.show_whitespaces?, - whitespace_map: defaults.whitespace_map.clone()?, - extend_comment_on_newline: defaults.extend_comment_on_newline?, - inlay_hints: defaults.inlay_hints.clone()?, - use_autoclose: defaults.use_autoclose?, - use_auto_surround: defaults.use_auto_surround?, - use_on_type_format: defaults.use_on_type_format?, - auto_indent: defaults.auto_indent?, - auto_indent_on_paste: defaults.auto_indent_on_paste?, - always_treat_brackets_as_autoclosed: defaults.always_treat_brackets_as_autoclosed?, - code_actions_on_format: defaults.code_actions_on_format.clone()?, - linked_edits: defaults.linked_edits?, - tasks: defaults.tasks.clone()?, - show_completions_on_input: defaults.show_completions_on_input?, - show_completion_documentation: defaults.show_completion_documentation?, - completions: defaults.completions.clone()?, - debuggers: defaults.debuggers.clone()?, + tab_size: defaults.tab_size.unwrap(), + hard_tabs: defaults.hard_tabs.unwrap(), + soft_wrap: defaults.soft_wrap.unwrap(), + preferred_line_length: defaults.preferred_line_length.unwrap(), + show_wrap_guides: defaults.show_wrap_guides.unwrap(), + wrap_guides: defaults.wrap_guides.unwrap(), + indent_guides: defaults.indent_guides.unwrap(), + format_on_save: defaults.format_on_save.unwrap(), + remove_trailing_whitespace_on_save: defaults + .remove_trailing_whitespace_on_save + .unwrap(), + ensure_final_newline_on_save: defaults.ensure_final_newline_on_save.unwrap(), + formatter: defaults.formatter.unwrap(), + prettier: defaults.prettier.unwrap(), + jsx_tag_auto_close: defaults.jsx_tag_auto_close.unwrap(), + enable_language_server: defaults.enable_language_server.unwrap(), + language_servers: defaults.language_servers.unwrap(), + allow_rewrap: defaults.allow_rewrap.unwrap(), + show_edit_predictions: defaults.show_edit_predictions.unwrap(), + edit_predictions_disabled_in: defaults.edit_predictions_disabled_in.unwrap(), + show_whitespaces: defaults.show_whitespaces.unwrap(), + whitespace_map: defaults.whitespace_map.unwrap(), + extend_comment_on_newline: defaults.extend_comment_on_newline.unwrap(), + inlay_hints: defaults.inlay_hints.unwrap(), + use_autoclose: defaults.use_autoclose.unwrap(), + use_auto_surround: defaults.use_auto_surround.unwrap(), + use_on_type_format: defaults.use_on_type_format.unwrap(), + auto_indent: defaults.auto_indent.unwrap(), + auto_indent_on_paste: defaults.auto_indent_on_paste.unwrap(), + always_treat_brackets_as_autoclosed: defaults + .always_treat_brackets_as_autoclosed + .unwrap(), + code_actions_on_format: defaults.code_actions_on_format.unwrap(), + linked_edits: defaults.linked_edits.unwrap(), + tasks: defaults.tasks.unwrap(), + show_completions_on_input: defaults.show_completions_on_input.unwrap(), + show_completion_documentation: defaults.show_completion_documentation.unwrap(), + completions: defaults.completions.unwrap(), + debuggers: defaults.debuggers.unwrap(), }; let mut languages = HashMap::default(); @@ -426,16 +430,17 @@ impl settings::Settings for AllLanguageSettings { .features .as_ref() .and_then(|f| f.edit_prediction_provider); - let edit_predictions_mode = all_languages - .edit_predictions - .as_ref() - .map(|edit_predictions| edit_predictions.mode)?; + let edit_predictions_mode = all_languages.edit_predictions.as_ref().unwrap().mode; let disabled_globs: HashSet<&String> = all_languages .edit_predictions .as_ref() - .and_then(|c| c.disabled_globs.as_ref()) - .map(|globs| globs.iter().collect())?; + .unwrap() + .disabled_globs + .as_ref() + .unwrap() + .iter() + .collect(); let copilot_settings = all_languages .edit_predictions @@ -460,14 +465,14 @@ impl settings::Settings for AllLanguageSettings { let mut builder = GlobSetBuilder::new(); for pattern in patterns { - builder.add(Glob::new(pattern).log_err()?); + builder.add(Glob::new(pattern).unwrap()); } - file_types.insert(language.clone(), builder.build().log_err()?); + file_types.insert(language.clone(), builder.build().unwrap()); file_globs.insert(language.clone(), patterns.clone()); } - Some(Self { + Self { edit_predictions: EditPredictionSettings { provider: if let Some(provider) = edit_prediction_provider { provider @@ -492,7 +497,7 @@ impl settings::Settings for AllLanguageSettings { languages, file_types, file_globs, - }) + } } fn refine(&mut self, content: &SettingsContent, _cx: &mut App) { diff --git a/crates/multi_buffer/src/multi_buffer.rs b/crates/multi_buffer/src/multi_buffer.rs index f9d99473fbd196152418376d1bfbf63e21ad8b00..5273007a9fc44700eea5078c35636fe9282d486f 100644 --- a/crates/multi_buffer/src/multi_buffer.rs +++ b/crates/multi_buffer/src/multi_buffer.rs @@ -5913,7 +5913,7 @@ impl MultiBufferSnapshot { end_row: last_row, depth: next_depth, tab_size, - settings: settings.indent_guides, + settings: settings.indent_guides.clone(), }); } } diff --git a/crates/settings/src/base_keymap_setting.rs b/crates/settings/src/base_keymap_setting.rs index b7ac08f620d1aba93178c8cd74e3a271a8689a82..4c212e60d3c7ac427cd71608640470da8f3cbe4b 100644 --- a/crates/settings/src/base_keymap_setting.rs +++ b/crates/settings/src/base_keymap_setting.rs @@ -139,8 +139,8 @@ pub struct BaseKeymapSetting { } impl Settings for BaseKeymap { - fn from_default(s: &crate::settings_content::SettingsContent, _cx: &mut App) -> Option { - s.base_keymap.map(Into::into) + fn from_defaults(s: &crate::settings_content::SettingsContent, _cx: &mut App) -> Self { + s.base_keymap.unwrap().into() } fn refine(&mut self, s: &settings_content::SettingsContent, _cx: &mut App) { diff --git a/crates/settings/src/settings_store.rs b/crates/settings/src/settings_store.rs index e99e9eb452f6c148a18d4cadb04ac7dcf2eafc05..93ec6cc995a7e14f8eaf3aafad65dbdd7b35e7ef 100644 --- a/crates/settings/src/settings_store.rs +++ b/crates/settings/src/settings_store.rs @@ -57,8 +57,15 @@ pub trait Settings: 'static + Send + Sync + Sized { /// user settings match the current version of the settings. const PRESERVED_KEYS: Option<&'static [&'static str]> = None; - fn from_default(content: &SettingsContent, cx: &mut App) -> Option; + /// Read the value from default.json. + /// This function *should* panic if default values are missing, + /// and you should add a default to default.json for documentation. + fn from_defaults(content: &SettingsContent, cx: &mut App) -> Self; + /// Update the value based on the content from the current file. + /// + /// This function *should not* panic if there are problems, as the + /// content of user-provided settings files may be incomplete or invalid. fn refine(&mut self, content: &SettingsContent, cx: &mut App); fn missing_default() -> anyhow::Error { @@ -186,7 +193,7 @@ struct SettingValue { trait AnySettingValue: 'static + Send + Sync { fn setting_type_name(&self) -> &'static str; - fn from_default(&self, s: &SettingsContent, cx: &mut App) -> Option>; + fn from_default(&self, s: &SettingsContent, cx: &mut App) -> Box; fn refine(&self, value: &mut dyn Any, s: &[&SettingsContent], cx: &mut App); fn value_for_path(&self, path: Option) -> &dyn Any; @@ -277,12 +284,7 @@ impl SettingsStore { if let Some(server_settings) = self.server_settings.as_ref() { refinements.push(server_settings) } - let Some(mut value) = T::from_default(&self.default_settings, cx) else { - panic!( - "{}::from_default return None for default.json", - type_name::() - ) - }; + let mut value = T::from_defaults(&self.default_settings, cx); for refinement in refinements { value.refine(refinement, cx) } @@ -864,9 +866,7 @@ impl SettingsStore { for setting_value in self.setting_values.values_mut() { // If the global settings file changed, reload the global value for the field. if changed_local_path.is_none() { - let mut value = setting_value - .from_default(&self.default_settings, cx) - .unwrap(); + let mut value = setting_value.from_default(&self.default_settings, cx); setting_value.refine(value.as_mut(), &refinements, cx); setting_value.set_global_value(value); } @@ -898,9 +898,7 @@ impl SettingsStore { continue; } - let mut value = setting_value - .from_default(&self.default_settings, cx) - .unwrap(); + let mut value = setting_value.from_default(&self.default_settings, cx); setting_value.refine(value.as_mut(), &refinements, cx); setting_value.refine(value.as_mut(), &project_settings_stack, cx); setting_value.set_local_value(*root_id, directory_path.clone(), value); @@ -984,8 +982,8 @@ impl Debug for SettingsStore { } impl AnySettingValue for SettingValue { - fn from_default(&self, s: &SettingsContent, cx: &mut App) -> Option> { - T::from_default(s, cx).map(|result| Box::new(result) as _) + fn from_default(&self, s: &SettingsContent, cx: &mut App) -> Box { + Box::new(T::from_defaults(s, cx)) as _ } fn refine(&self, value: &mut dyn Any, refinements: &[&SettingsContent], cx: &mut App) { @@ -1063,10 +1061,10 @@ mod tests { } impl Settings for AutoUpdateSetting { - fn from_default(content: &SettingsContent, _: &mut App) -> Option { - content - .auto_update - .map(|auto_update| AutoUpdateSetting { auto_update }) + fn from_defaults(content: &SettingsContent, _: &mut App) -> Self { + AutoUpdateSetting { + auto_update: content.auto_update.unwrap(), + } } fn refine(&mut self, content: &SettingsContent, _: &mut App) { @@ -1085,12 +1083,12 @@ mod tests { } impl Settings for TitleBarSettings { - fn from_default(content: &SettingsContent, _: &mut App) -> Option { - let content = content.title_bar.clone()?; - Some(TitleBarSettings { - show: content.show?, - show_branch_name: content.show_branch_name?, - }) + fn from_defaults(content: &SettingsContent, _: &mut App) -> Self { + let content = content.title_bar.clone().unwrap(); + TitleBarSettings { + show: content.show.unwrap(), + show_branch_name: content.show_branch_name.unwrap(), + } } fn refine(&mut self, content: &SettingsContent, _: &mut App) { @@ -1121,12 +1119,12 @@ mod tests { } impl Settings for DefaultLanguageSettings { - fn from_default(content: &SettingsContent, _: &mut App) -> Option { + fn from_defaults(content: &SettingsContent, _: &mut App) -> Self { let content = &content.project.all_languages.defaults; - Some(DefaultLanguageSettings { - tab_size: content.tab_size?, - preferred_line_length: content.preferred_line_length?, - }) + DefaultLanguageSettings { + tab_size: content.tab_size.unwrap(), + preferred_line_length: content.preferred_line_length.unwrap(), + } } fn refine(&mut self, content: &SettingsContent, _: &mut App) { diff --git a/crates/theme/src/settings.rs b/crates/theme/src/settings.rs index fd0e2d633e83f0efedd1537c5be1fb9af1f416d0..1c2d834027103c6b38593657d2ffb3a27fe2b44b 100644 --- a/crates/theme/src/settings.rs +++ b/crates/theme/src/settings.rs @@ -796,31 +796,37 @@ fn font_fallbacks_from_settings( } impl settings::Settings for ThemeSettings { - fn from_default(content: &settings::SettingsContent, cx: &mut App) -> Option { + fn from_defaults(content: &settings::SettingsContent, cx: &mut App) -> Self { let content = &content.theme; - dbg!(&content); + // todo(settings_refactor). This should *not* require cx... let themes = ThemeRegistry::default_global(cx); let system_appearance = SystemAppearance::default_global(cx); - let theme_selection: ThemeSelection = content.theme.clone()?.into(); - let icon_theme_selection: IconThemeSelection = content.icon_theme.clone()?.into(); - let this = Self { - ui_font_size: content.ui_font_size?.into(), + let theme_selection: ThemeSelection = content.theme.clone().unwrap().into(); + let icon_theme_selection: IconThemeSelection = content.icon_theme.clone().unwrap().into(); + Self { + ui_font_size: content.ui_font_size.unwrap().into(), ui_font: Font { - family: content.ui_font_family.as_ref()?.0.clone().into(), - features: content.ui_font_features.clone()?, + family: content.ui_font_family.as_ref().unwrap().0.clone().into(), + features: content.ui_font_features.clone().unwrap(), fallbacks: font_fallbacks_from_settings(content.ui_font_fallbacks.clone()), - weight: content.ui_font_weight.map(FontWeight)?, + weight: content.ui_font_weight.map(FontWeight).unwrap(), style: Default::default(), }, buffer_font: Font { - family: content.buffer_font_family.as_ref()?.0.clone().into(), - features: content.buffer_font_features.clone()?, + family: content + .buffer_font_family + .as_ref() + .unwrap() + .0 + .clone() + .into(), + features: content.buffer_font_features.clone().unwrap(), fallbacks: font_fallbacks_from_settings(content.buffer_font_fallbacks.clone()), - weight: content.buffer_font_weight.map(FontWeight)?, + weight: content.buffer_font_weight.map(FontWeight).unwrap(), style: FontStyle::default(), }, - buffer_font_size: content.buffer_font_size?.into(), - buffer_line_height: content.buffer_line_height?.into(), + buffer_font_size: content.buffer_font_size.unwrap().into(), + buffer_line_height: content.buffer_line_height.unwrap().into(), agent_font_size: content.agent_font_size.flatten().map(Into::into), active_theme: themes .get(theme_selection.theme(*system_appearance)) @@ -831,13 +837,12 @@ impl settings::Settings for ThemeSettings { theme_overrides: HashMap::default(), active_icon_theme: themes .get_icon_theme(icon_theme_selection.icon_theme(*system_appearance)) - .ok()?, + .ok() + .unwrap(), icon_theme_selection: Some(icon_theme_selection), ui_density: content.ui_density.unwrap_or_default().into(), - unnecessary_code_fade: content.unnecessary_code_fade?, - }; - - Some(this) + unnecessary_code_fade: content.unnecessary_code_fade.unwrap(), + } } fn refine(&mut self, content: &SettingsContent, cx: &mut App) { diff --git a/crates/title_bar/src/title_bar_settings.rs b/crates/title_bar/src/title_bar_settings.rs index 9d0d8ff511a9315b2fc68bfc1fe3e346e836e6d4..0b386d496788547a91255ec5f175a99c1391bda4 100644 --- a/crates/title_bar/src/title_bar_settings.rs +++ b/crates/title_bar/src/title_bar_settings.rs @@ -24,7 +24,7 @@ pub struct TitleBarSettings { } impl Settings for TitleBarSettings { - fn from_default(s: &SettingsContent) -> Option { + fn from_defaults(s: &SettingsContent) -> Option { let content = s.title_bar?; TitleBarSettings { show: content.show?, diff --git a/crates/vim_mode_setting/src/vim_mode_setting.rs b/crates/vim_mode_setting/src/vim_mode_setting.rs index 8fa12bbd644f48929e6be8e2ba6fa9ad087b8356..7c0a21e443fe908191bf3cff9d557a1bf38971b9 100644 --- a/crates/vim_mode_setting/src/vim_mode_setting.rs +++ b/crates/vim_mode_setting/src/vim_mode_setting.rs @@ -16,8 +16,8 @@ pub fn init(cx: &mut App) { pub struct VimModeSetting(pub bool); impl Settings for VimModeSetting { - fn from_default(content: &SettingsContent, _cx: &mut App) -> Option { - Some(Self(content.vim_mode?)) + fn from_defaults(content: &SettingsContent, _cx: &mut App) -> Self { + Self(content.vim_mode.unwrap()) } fn refine(&mut self, content: &SettingsContent, _cx: &mut App) { @@ -34,8 +34,8 @@ impl Settings for VimModeSetting { pub struct HelixModeSetting(pub bool); impl Settings for HelixModeSetting { - fn from_default(content: &SettingsContent, _cx: &mut App) -> Option { - Some(Self(content.helix_mode?)) + fn from_defaults(content: &SettingsContent, _cx: &mut App) -> Self { + Self(content.helix_mode.unwrap()) } fn refine(&mut self, content: &SettingsContent, _cx: &mut App) { diff --git a/crates/zlog_settings/src/zlog_settings.rs b/crates/zlog_settings/src/zlog_settings.rs index fc350e035b8f42ad6ab6515960e6506637de2b31..0d464b872067683e7fad8db6f4049eff92d5ed8b 100644 --- a/crates/zlog_settings/src/zlog_settings.rs +++ b/crates/zlog_settings/src/zlog_settings.rs @@ -24,10 +24,10 @@ pub struct ZlogSettings { } impl Settings for ZlogSettings { - fn from_default(content: &settings::SettingsContent, _: &mut App) -> Option { - Some(ZlogSettings { - scopes: content.log.clone()?, - }) + fn from_defaults(content: &settings::SettingsContent, _: &mut App) -> Self { + ZlogSettings { + scopes: content.log.clone().unwrap(), + } } fn refine(&mut self, content: &settings::SettingsContent, _: &mut App) {