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 NuLanguageServer;
8
9#[async_trait(?Send)]
10impl LspAdapter for NuLanguageServer {
11 fn name(&self) -> LanguageServerName {
12 LanguageServerName("nu".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 "nu v0.87.0 or greater 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: "nu".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}