diff --git a/crates/client/src/client.rs b/crates/client/src/client.rs index cb8185c7ed326ed7d45726a99077c53903118316..e3f87645953b2d8efff862bc50c51f25f1f04bf7 100644 --- a/crates/client/src/client.rs +++ b/crates/client/src/client.rs @@ -31,7 +31,7 @@ use release_channel::{AppVersion, ReleaseChannel}; use rpc::proto::{AnyTypedEnvelope, EnvelopedMessage, PeerId, RequestMessage}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; -use settings::{Settings, SettingsKey, SettingsSources, SettingsUi}; +use settings::{Settings, SettingsContent, SettingsKey, SettingsUi}; use std::{ any::TypeId, convert::TryFrom, @@ -50,7 +50,7 @@ use telemetry::Telemetry; use thiserror::Error; use tokio::net::TcpStream; use url::Url; -use util::{ConnectionResult, ResultExt}; +use util::{ConnectionResult, MergeFrom, ResultExt}; pub use rpc::*; pub use telemetry_events::Event; @@ -96,29 +96,25 @@ actions!( ] ); -#[derive(Clone, Default, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey)] -#[settings_key(None)] -pub struct ClientSettingsContent { - server_url: Option, -} - #[derive(Deserialize)] pub struct ClientSettings { pub server_url: String, } impl Settings for ClientSettings { - type FileContent = ClientSettingsContent; + fn from_defaults(content: &settings::SettingsContent, _cx: &mut App) -> Self { + Self { + server_url: content.server_url.clone().unwrap(), + } + } - fn load(sources: SettingsSources, _: &mut App) -> Result { - let mut result = sources.json_merge::()?; - if let Some(server_url) = &*ZED_SERVER_URL { - result.server_url.clone_from(server_url) + fn refine(&mut self, content: &settings::SettingsContent, _: &mut App) { + if let Some(server_url) = content.server_url.clone() { + self.server_url = server_url } - Ok(result) } - fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut Self::FileContent) {} + fn import_from_vscode(_vscode: &settings::VsCodeSettings, _current: &mut SettingsContent) {} } #[derive(Default, Clone, Serialize, Deserialize, JsonSchema, SettingsUi, SettingsKey)] @@ -133,19 +129,19 @@ pub struct ProxySettings { } impl Settings for ProxySettings { - type FileContent = ProxySettingsContent; - - fn load(sources: SettingsSources, _: &mut App) -> Result { - Ok(Self { - proxy: sources - .user - .or(sources.server) - .and_then(|value| value.proxy.clone()) - .or(sources.default.proxy.clone()), - }) + fn from_defaults(content: &settings::SettingsContent, _cx: &mut App) -> Self { + Self { + proxy: content.proxy.clone(), + } + } + + fn refine(&mut self, content: &settings::SettingsContent, _: &mut App) { + if let Some(proxy) = content.proxy.clone() { + self.proxy = Some(proxy) + } } - fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut Self::FileContent) { + fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut SettingsContent) { vscode.string_setting("http.proxy", &mut current.proxy); } } @@ -524,37 +520,41 @@ pub struct TelemetrySettings { pub metrics: bool, } -/// Control what info is collected by Zed. -#[derive(Default, Clone, Serialize, Deserialize, JsonSchema, Debug, SettingsUi, SettingsKey)] -#[settings_key(key = "telemetry")] -pub struct TelemetrySettingsContent { - /// Send debug info like crash reports. - /// - /// Default: true - pub diagnostics: Option, - /// Send anonymized usage data like what languages you're using Zed with. - /// - /// Default: true - pub metrics: Option, -} - impl settings::Settings for TelemetrySettings { - type FileContent = TelemetrySettingsContent; + fn from_defaults(content: &SettingsContent, _cx: &mut App) -> Self { + Self { + diagnostics: content.telemetry.as_ref().unwrap().diagnostics.unwrap(), + metrics: content.telemetry.as_ref().unwrap().metrics.unwrap(), + } + } - fn load(sources: SettingsSources, _: &mut App) -> Result { - sources.json_merge() + fn refine(&mut self, content: &SettingsContent, cx: &mut App) { + let Some(telemetry) = &content.telemetry else { + return; + }; + self.diagnostics.merge_from(&telemetry.diagnostics); + self.metrics.merge_from(&telemetry.metrics); } - fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut Self::FileContent) { - vscode.enum_setting("telemetry.telemetryLevel", &mut current.metrics, |s| { + fn import_from_vscode(vscode: &settings::VsCodeSettings, current: &mut SettingsContent) { + let mut telemetry = settings::TelemetrySettingsContent::default(); + vscode.enum_setting("telemetry.telemetryLevel", &mut telemetry.metrics, |s| { Some(s == "all") }); - vscode.enum_setting("telemetry.telemetryLevel", &mut current.diagnostics, |s| { - Some(matches!(s, "all" | "error" | "crash")) - }); + vscode.enum_setting( + "telemetry.telemetryLevel", + &mut telemetry.diagnostics, + |s| Some(matches!(s, "all" | "error" | "crash")), + ); // we could translate telemetry.telemetryLevel, but just because users didn't want // to send microsoft telemetry doesn't mean they don't want to send it to zed. their // all/error/crash/off correspond to combinations of our "diagnostics" and "metrics". + if let Some(diagnostics) = telemetry.diagnostics { + current.telemetry.get_or_insert_default().diagnostics = Some(diagnostics) + } + if let Some(metrics) = telemetry.metrics { + current.telemetry.get_or_insert_default().metrics = Some(metrics) + } } } diff --git a/crates/settings/src/settings_content.rs b/crates/settings/src/settings_content.rs index 54c25198c4f0d6f56e963cd1670caf4ee40815e4..6fee5fad886ac47ec97cb4a87a975ff2406e4861 100644 --- a/crates/settings/src/settings_content.rs +++ b/crates/settings/src/settings_content.rs @@ -43,6 +43,14 @@ pub struct SettingsContent { /// Example: {"log": {"client": "warn"}} pub log: Option>, + pub proxy: Option, + + /// The URL of the Zed server to connect to. + pub server_url: Option, + + /// Control what info is collected by Zed. + pub telemetry: Option, + /// Configuration of the terminal in Zed. pub terminal: Option, @@ -265,3 +273,15 @@ pub struct WorktreeSettingsContent { /// Default: [ "**/.env*" ] pub private_files: Option>, } +/// Control what info is collected by Zed. +#[derive(Default, Clone, Serialize, Deserialize, JsonSchema, Debug)] +pub struct TelemetrySettingsContent { + /// Send debug info like crash reports. + /// + /// Default: true + pub diagnostics: Option, + /// Send anonymized usage data like what languages you're using Zed with. + /// + /// Default: true + pub metrics: Option, +}