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 ErlangLspAdapter;
8
9#[async_trait]
10impl LspAdapter for ErlangLspAdapter {
11 fn name(&self) -> LanguageServerName {
12 LanguageServerName("erlang_ls".into())
13 }
14
15 fn short_name(&self) -> &'static str {
16 "erlang_ls"
17 }
18
19 async fn fetch_latest_server_version(
20 &self,
21 _: &dyn LspAdapterDelegate,
22 ) -> Result<Box<dyn 'static + Send + Any>> {
23 Ok(Box::new(()) as Box<_>)
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 "erlang_ls must be installed and available in your $PATH"
34 ))
35 }
36
37 async fn cached_server_binary(
38 &self,
39 _: PathBuf,
40 _: &dyn LspAdapterDelegate,
41 ) -> Option<LanguageServerBinary> {
42 Some(LanguageServerBinary {
43 path: "erlang_ls".into(),
44 env: None,
45 arguments: vec![],
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 Some(LanguageServerBinary {
55 path: "erlang_ls".into(),
56 env: None,
57 arguments: vec!["--version".into()],
58 })
59 }
60}