haskell.rs

 1use anyhow::{anyhow, Result};
 2use async_trait::async_trait;
 3use language::{LanguageServerName, LspAdapter, LspAdapterDelegate};
 4use lsp::LanguageServerBinary;
 5use std::{any::Any, path::PathBuf};
 6
 7pub struct HaskellLanguageServer;
 8
 9#[async_trait]
10impl LspAdapter for HaskellLanguageServer {
11    fn name(&self) -> LanguageServerName {
12        LanguageServerName("hls".into())
13    }
14
15    fn short_name(&self) -> &'static str {
16        "hls"
17    }
18
19    async fn fetch_latest_server_version(
20        &self,
21        _: &dyn LspAdapterDelegate,
22    ) -> Result<Box<dyn 'static + Any + Send>> {
23        Ok(Box::new(()))
24    }
25
26    async fn fetch_server_binary(
27        &self,
28        _version: Box<dyn 'static + Send + Any>,
29        _container_dir: PathBuf,
30        _: &dyn LspAdapterDelegate,
31    ) -> Result<LanguageServerBinary> {
32        Err(anyhow!(
33            "hls (haskell language server) must be installed via ghcup"
34        ))
35    }
36
37    async fn cached_server_binary(
38        &self,
39        _: PathBuf,
40        _: &dyn LspAdapterDelegate,
41    ) -> Option<LanguageServerBinary> {
42        Some(LanguageServerBinary {
43            path: "haskell-language-server-wrapper".into(),
44            env: None,
45            arguments: vec!["lsp".into()],
46        })
47    }
48
49    fn can_be_reinstalled(&self) -> bool {
50        false
51    }
52
53    async fn installation_test_binary(&self, _: PathBuf) -> Option<LanguageServerBinary> {
54        None
55    }
56}