diff --git a/crates/extension/src/extension_settings.rs b/crates/extension/src/extension_settings.rs index c11a6622b8..a2ab7ac9cc 100644 --- a/crates/extension/src/extension_settings.rs +++ b/crates/extension/src/extension_settings.rs @@ -5,7 +5,6 @@ use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use settings::{Settings, SettingsSources}; use std::sync::Arc; -use util::merge_non_null_json_value_into; #[derive(Deserialize, Serialize, Debug, Default, Clone, JsonSchema)] pub struct ExtensionSettings { @@ -42,10 +41,8 @@ impl Settings for ExtensionSettings { type FileContent = Self; fn load(sources: SettingsSources, _cx: &mut AppContext) -> Result { - let mut merged = serde_json::Value::Null; - for value in [sources.default].into_iter().chain(sources.user) { - merge_non_null_json_value_into(serde_json::to_value(value).unwrap(), &mut merged); - } - Ok(serde_json::from_value(merged)?) + SettingsSources::::json_merge_with( + [sources.default].into_iter().chain(sources.user), + ) } } diff --git a/crates/settings/src/settings_store.rs b/crates/settings/src/settings_store.rs index cdc2640092..a6bb5838f9 100644 --- a/crates/settings/src/settings_store.rs +++ b/crates/settings/src/settings_store.rs @@ -116,16 +116,25 @@ impl<'a, T: Serialize> SettingsSources<'a, T> { .chain(self.project.iter().copied()) } + /// Returns the settings after performing a JSON merge of the provided customizations. + /// + /// Customizations later in the iterator win out over the earlier ones. + pub fn json_merge_with( + customizations: impl Iterator, + ) -> Result { + let mut merged = serde_json::Value::Null; + for value in customizations { + merge_non_null_json_value_into(serde_json::to_value(value).unwrap(), &mut merged); + } + Ok(serde_json::from_value(merged)?) + } + /// Returns the settings after performing a JSON merge of the customizations into the /// default settings. /// /// More-specific customizations win out over the less-specific ones. - pub fn json_merge(&self) -> Result { - let mut merged = serde_json::Value::Null; - for value in self.defaults_and_customizations() { - merge_non_null_json_value_into(serde_json::to_value(value).unwrap(), &mut merged); - } - Ok(serde_json::from_value(merged)?) + pub fn json_merge(&'a self) -> Result { + Self::json_merge_with(self.defaults_and_customizations()) } }