summaryrefslogtreecommitdiff
path: root/cli/lsp/config.rs
diff options
context:
space:
mode:
authorNayeem Rahman <nayeemrmn99@gmail.com>2024-09-11 00:20:03 +0100
committerGitHub <noreply@github.com>2024-09-11 00:20:03 +0100
commitf959297dcd382b25bdedd0ff6aa27e8fb40e7ecd (patch)
treef30f58be88150fb49b6207aee79058714197f3aa /cli/lsp/config.rs
parent4865ae13e1a637a86de1266f1f5147b6142872c6 (diff)
feat(lsp): unstable setting as list (#25552)
Diffstat (limited to 'cli/lsp/config.rs')
-rw-r--r--cli/lsp/config.rs56
1 files changed, 53 insertions, 3 deletions
diff --git a/cli/lsp/config.rs b/cli/lsp/config.rs
index c9729a5e5..c5d064285 100644
--- a/cli/lsp/config.rs
+++ b/cli/lsp/config.rs
@@ -43,6 +43,8 @@ use indexmap::IndexSet;
use lsp_types::ClientCapabilities;
use std::collections::BTreeMap;
use std::collections::HashMap;
+use std::ops::Deref;
+use std::ops::DerefMut;
use std::path::Path;
use std::path::PathBuf;
use std::sync::Arc;
@@ -70,6 +72,54 @@ fn is_true() -> bool {
true
}
+/// Wrapper that defaults if it fails to deserialize. Good for individual
+/// settings.
+#[derive(Debug, Default, Clone, Eq, PartialEq)]
+pub struct SafeValue<T> {
+ inner: T,
+}
+
+impl<'de, T: Default + for<'de2> Deserialize<'de2>> Deserialize<'de>
+ for SafeValue<T>
+{
+ fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+ where
+ D: serde::Deserializer<'de>,
+ {
+ Ok(Self {
+ inner: Deserialize::deserialize(deserializer).unwrap_or_default(),
+ })
+ }
+}
+
+impl<T: Serialize> Serialize for SafeValue<T> {
+ fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
+ where
+ S: serde::Serializer,
+ {
+ self.inner.serialize(serializer)
+ }
+}
+
+impl<T> Deref for SafeValue<T> {
+ type Target = T;
+ fn deref(&self) -> &Self::Target {
+ &self.inner
+ }
+}
+
+impl<T> DerefMut for SafeValue<T> {
+ fn deref_mut(&mut self) -> &mut T {
+ &mut self.inner
+ }
+}
+
+impl<T> SafeValue<T> {
+ pub fn as_deref(&self) -> &T {
+ &self.inner
+ }
+}
+
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct CodeLensSettings {
@@ -538,7 +588,7 @@ pub struct WorkspaceSettings {
pub unsafely_ignore_certificate_errors: Option<Vec<String>>,
#[serde(default)]
- pub unstable: bool,
+ pub unstable: SafeValue<Vec<String>>,
#[serde(default)]
pub javascript: LanguageWorkspaceSettings,
@@ -568,7 +618,7 @@ impl Default for WorkspaceSettings {
testing: Default::default(),
tls_certificate: None,
unsafely_ignore_certificate_errors: None,
- unstable: false,
+ unstable: Default::default(),
javascript: Default::default(),
typescript: Default::default(),
}
@@ -2141,7 +2191,7 @@ mod tests {
},
tls_certificate: None,
unsafely_ignore_certificate_errors: None,
- unstable: false,
+ unstable: Default::default(),
javascript: LanguageWorkspaceSettings {
inlay_hints: InlayHintsSettings {
parameter_names: InlayHintsParamNamesOptions {