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    async fn fetch_latest_server_version(
16        &self,
17        _: &dyn LspAdapterDelegate,
18    ) -> Result<Box<dyn 'static + Any + Send>> {
19        Ok(Box::new(()))
20    }
21
22    async fn fetch_server_binary(
23        &self,
24        _version: Box<dyn 'static + Send + Any>,
25        _container_dir: PathBuf,
26        _: &dyn LspAdapterDelegate,
27    ) -> Result<LanguageServerBinary> {
28        Err(anyhow!(
29            "hls (haskell language server) must be installed via ghcup"
30        ))
31    }
32
33    async fn cached_server_binary(
34        &self,
35        _: PathBuf,
36        _: &dyn LspAdapterDelegate,
37    ) -> Option<LanguageServerBinary> {
38        Some(LanguageServerBinary {
39            path: "haskell-language-server-wrapper".into(),
40            env: None,
41            arguments: vec!["lsp".into()],
42        })
43    }
44
45    fn can_be_reinstalled(&self) -> bool {
46        false
47    }
48
49    async fn installation_test_binary(&self, _: PathBuf) -> Option<LanguageServerBinary> {
50        None
51    }
52}