settings: Use a derive macro for refine (#38451)

When we refactored settings to not pass JSON blobs around, we ended up
needing
to write *a lot* of code that just merged things (like json merge used
to do).

Use a derive macro to prevent typos in this logic.

Release Notes:

- N/A
This commit is contained in:
Conrad Irwin
2025-09-18 21:13:49 +00:00
committed by GitHub
parent 5f4f0a873e
commit b09764c54a
74 changed files with 1089 additions and 2818 deletions
+1 -111
View File
@@ -3,7 +3,6 @@ use std::sync::Arc;
use collections::HashMap;
use gpui::App;
use settings::Settings;
use util::MergeFrom;
use crate::provider::{
anthropic::AnthropicSettings, bedrock::AmazonBedrockSettings, cloud::ZedDotDevSettings,
@@ -37,7 +36,7 @@ pub struct AllLanguageModelSettings {
impl settings::Settings for AllLanguageModelSettings {
const PRESERVED_KEYS: Option<&'static [&'static str]> = Some(&["version"]);
fn from_defaults(content: &settings::SettingsContent, _cx: &mut App) -> Self {
fn from_settings(content: &settings::SettingsContent, _cx: &mut App) -> Self {
let language_models = content.language_models.clone().unwrap();
let anthropic = language_models.anthropic.unwrap();
let bedrock = language_models.bedrock.unwrap();
@@ -118,113 +117,4 @@ impl settings::Settings for AllLanguageModelSettings {
},
}
}
fn refine(&mut self, content: &settings::SettingsContent, _cx: &mut App) {
let Some(models) = content.language_models.as_ref() else {
return;
};
if let Some(anthropic) = models.anthropic.as_ref() {
self.anthropic
.available_models
.merge_from(&anthropic.available_models);
self.anthropic.api_url.merge_from(&anthropic.api_url);
}
if let Some(bedrock) = models.bedrock.clone() {
self.bedrock
.available_models
.merge_from(&bedrock.available_models);
if let Some(endpoint_url) = bedrock.endpoint_url {
self.bedrock.endpoint = Some(endpoint_url)
}
if let Some(region) = bedrock.region {
self.bedrock.region = Some(region)
}
if let Some(profile_name) = bedrock.profile {
self.bedrock.profile_name = Some(profile_name);
}
if let Some(auth_method) = bedrock.authentication_method {
self.bedrock.authentication_method = Some(auth_method.into());
}
}
if let Some(deepseek) = models.deepseek.as_ref() {
self.deepseek
.available_models
.merge_from(&deepseek.available_models);
self.deepseek.api_url.merge_from(&deepseek.api_url);
}
if let Some(google) = models.google.as_ref() {
self.google
.available_models
.merge_from(&google.available_models);
self.google.api_url.merge_from(&google.api_url);
}
if let Some(lmstudio) = models.lmstudio.as_ref() {
self.lmstudio
.available_models
.merge_from(&lmstudio.available_models);
self.lmstudio.api_url.merge_from(&lmstudio.api_url);
}
if let Some(mistral) = models.mistral.as_ref() {
self.mistral
.available_models
.merge_from(&mistral.available_models);
self.mistral.api_url.merge_from(&mistral.api_url);
}
if let Some(ollama) = models.ollama.as_ref() {
self.ollama
.available_models
.merge_from(&ollama.available_models);
self.ollama.api_url.merge_from(&ollama.api_url);
}
if let Some(open_router) = models.open_router.as_ref() {
self.open_router
.available_models
.merge_from(&open_router.available_models);
self.open_router.api_url.merge_from(&open_router.api_url);
}
if let Some(openai) = models.openai.as_ref() {
self.openai
.available_models
.merge_from(&openai.available_models);
self.openai.api_url.merge_from(&openai.api_url);
}
if let Some(openai_compatible) = models.openai_compatible.clone() {
for (name, value) in openai_compatible {
self.openai_compatible.insert(
name,
OpenAiCompatibleSettings {
api_url: value.api_url,
available_models: value.available_models,
},
);
}
}
if let Some(vercel) = models.vercel.as_ref() {
self.vercel
.available_models
.merge_from(&vercel.available_models);
self.vercel.api_url.merge_from(&vercel.api_url);
}
if let Some(x_ai) = models.x_ai.as_ref() {
self.x_ai
.available_models
.merge_from(&x_ai.available_models);
self.x_ai.api_url.merge_from(&x_ai.api_url);
}
if let Some(zed_dot_dev) = models.zed_dot_dev.as_ref() {
self.zed_dot_dev
.available_models
.merge_from(&zed_dot_dev.available_models);
}
}
}