From a123fb60572720a5fd0817b194f4d34534f87b4e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bla=C5=BE=20Hrastnik?= <blaz@mxxn.io>
Date: Wed, 7 Sep 2022 16:42:33 +0900
Subject: [PATCH] Remove LspNotDefined, instead return an Option<>

---
 helix-lsp/src/lib.rs        | 16 +++++-----------
 helix-term/src/ui/editor.rs |  1 +
 helix-view/src/editor.rs    |  1 +
 3 files changed, 7 insertions(+), 11 deletions(-)

diff --git a/helix-lsp/src/lib.rs b/helix-lsp/src/lib.rs
index 516c93ca..a39325fa 100644
--- a/helix-lsp/src/lib.rs
+++ b/helix-lsp/src/lib.rs
@@ -38,8 +38,6 @@ pub enum Error {
     Timeout,
     #[error("server closed the stream")]
     StreamClosed,
-    #[error("LSP not defined")]
-    LspNotDefined,
     #[error("Unhandled")]
     Unhandled,
     #[error(transparent)]
@@ -320,14 +318,14 @@ impl Registry {
             .map(|(_, client)| client.as_ref())
     }
 
-    pub fn get(&mut self, language_config: &LanguageConfiguration) -> Result<Arc<Client>> {
+    pub fn get(&mut self, language_config: &LanguageConfiguration) -> Result<Option<Arc<Client>>> {
         let config = match &language_config.language_server {
             Some(config) => config,
-            None => return Err(Error::LspNotDefined),
+            None => return Ok(None),
         };
 
         match self.inner.entry(language_config.scope.clone()) {
-            Entry::Occupied(entry) => Ok(entry.get().1.clone()),
+            Entry::Occupied(entry) => Ok(Some(entry.get().1.clone())),
             Entry::Vacant(entry) => {
                 // initialize a new client
                 let id = self.counter.fetch_add(1, Ordering::Relaxed);
@@ -356,11 +354,7 @@ impl Registry {
                         .await;
 
                     if let Err(e) = value {
-                        if let Error::LspNotDefined = e {
-                            // Skip logging "lsp not defined"
-                        } else {
-                            log::error!("failed to initialize language server: {}", e);
-                        }
+                        log::error!("failed to initialize language server: {}", e);
                         return;
                     }
 
@@ -374,7 +368,7 @@ impl Registry {
                 });
 
                 entry.insert((id, client.clone()));
-                Ok(client)
+                Ok(Some(client))
             }
         }
     }
diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs
index 64e95e33..7cb29c3b 100644
--- a/helix-term/src/ui/editor.rs
+++ b/helix-term/src/ui/editor.rs
@@ -1316,6 +1316,7 @@ impl Component for EditorView {
                 if cx.editor.should_close() {
                     return EventResult::Ignored(None);
                 }
+
                 // if the focused view still exists and wasn't closed
                 if cx.editor.tree.contains(focus) {
                     let config = cx.editor.config();
diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs
index b6947e44..5eff9983 100644
--- a/helix-view/src/editor.rs
+++ b/helix-view/src/editor.rs
@@ -853,6 +853,7 @@ impl Editor {
                     )
                 })
                 .ok()
+                .flatten()
         });
         if let Some(language_server) = language_server {
             // only spawn a new lang server if the servers aren't the same