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}