@@ -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<String>,
-}
-
#[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<Self::FileContent>, _: &mut App) -> Result<Self> {
- let mut result = sources.json_merge::<Self>()?;
- 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<Self::FileContent>, _: &mut App) -> Result<Self> {
- 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<bool>,
- /// Send anonymized usage data like what languages you're using Zed with.
- ///
- /// Default: true
- pub metrics: Option<bool>,
-}
-
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<Self::FileContent>, _: &mut App) -> Result<Self> {
- 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)
+ }
}
}
@@ -43,6 +43,14 @@ pub struct SettingsContent {
/// Example: {"log": {"client": "warn"}}
pub log: Option<HashMap<String, String>>,
+ pub proxy: Option<String>,
+
+ /// The URL of the Zed server to connect to.
+ pub server_url: Option<String>,
+
+ /// Control what info is collected by Zed.
+ pub telemetry: Option<TelemetrySettingsContent>,
+
/// Configuration of the terminal in Zed.
pub terminal: Option<TerminalSettingsContent>,
@@ -265,3 +273,15 @@ pub struct WorktreeSettingsContent {
/// Default: [ "**/.env*" ]
pub private_files: Option<Vec<String>>,
}
+/// 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<bool>,
+ /// Send anonymized usage data like what languages you're using Zed with.
+ ///
+ /// Default: true
+ pub metrics: Option<bool>,
+}