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(?Send)]
10impl LspAdapter for ErlangLspAdapter {
11 fn name(&self) -> LanguageServerName {
12 LanguageServerName("erlang_ls".into())
13 }
14
15 async fn fetch_latest_server_version(
16 &self,
17 _: &dyn LspAdapterDelegate,
18 ) -> Result<Box<dyn 'static + Send + Any>> {
19 Ok(Box::new(()) as Box<_>)
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 "erlang_ls must be installed and available in your $PATH"
30 ))
31 }
32
33 async fn cached_server_binary(
34 &self,
35 _: PathBuf,
36 _: &dyn LspAdapterDelegate,
37 ) -> Option<LanguageServerBinary> {
38 Some(LanguageServerBinary {
39 path: "erlang_ls".into(),
40 env: None,
41 arguments: vec![],
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 Some(LanguageServerBinary {
51 path: "erlang_ls".into(),
52 env: None,
53 arguments: vec!["--version".into()],
54 })
55 }
56}