81 lines
2.1 KiB
Rust
81 lines
2.1 KiB
Rust
use std::sync::{Arc, Mutex};
|
|||
|
|
|
||
|
|
mod client;
|
||
|
|
pub use client::{path_to_lsp_uri, LspClient};
|
||
|
|
|
||
|
|
#[derive(Clone)]
|
||
|
|
pub struct LspServer {
|
||
|
|
#[allow(dead_code)]
|
||
|
|
pub name: String,
|
||
|
|
#[allow(dead_code)]
|
||
|
|
pub command: String,
|
||
|
|
#[allow(dead_code)]
|
||
|
|
pub args: Vec<String>,
|
||
|
|
pub language_id: String,
|
||
|
|
pub client: Arc<Mutex<LspClient>>,
|
||
|
|
}
|
||
|
|
|
||
|
|
#[derive(Clone)]
|
||
|
|
pub struct LspManager {
|
||
|
|
pub servers: Vec<LspServer>,
|
||
|
|
}
|
||
|
|
|
||
|
|
impl LspManager {
|
||
|
|
pub fn new() -> Self {
|
||
|
|
LspManager {
|
||
|
|
servers: Vec::new(),
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
pub fn connect(
|
||
|
|
&mut self,
|
||
|
|
name: &str,
|
||
|
|
command: &str,
|
||
|
|
args: &[String],
|
||
|
|
language_id: &str,
|
||
|
|
) -> anyhow::Result<()> {
|
||
|
|
if self.servers.iter().any(|s| s.name == name) {
|
||
|
|
anyhow::bail!("LSP server '{}' is already connected", name);
|
||
|
|
}
|
||
|
|
let client = LspClient::spawn(command, args)?;
|
||
|
|
self.servers.push(LspServer {
|
||
|
|
name: name.to_string(),
|
||
|
|
command: command.to_string(),
|
||
|
|
args: args.to_vec(),
|
||
|
|
language_id: language_id.to_string(),
|
||
|
|
client: Arc::new(Mutex::new(client)),
|
||
|
|
});
|
||
|
|
Ok(())
|
||
|
|
}
|
||
|
|
|
||
|
|
#[allow(dead_code)]
|
||
|
|
pub fn find_server(&self, name: &str) -> Option<&LspServer> {
|
||
|
|
self.servers.iter().find(|s| s.name == name)
|
||
|
|
}
|
||
|
|
|
||
|
|
pub fn get_client(&self, name: &str) -> Option<Arc<Mutex<LspClient>>> {
|
||
|
|
self.servers.iter().find(|s| s.name == name).map(|s| s.client.clone())
|
||
|
|
}
|
||
|
|
|
||
|
|
pub fn disconnect(&mut self, name: &str) -> bool {
|
||
|
|
if let Some(server) = self.servers.iter().find(|s| s.name == name) {
|
||
|
|
if let Ok(mut client) = server.client.lock() {
|
||
|
|
let _ = client.shutdown();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
let len = self.servers.len();
|
||
|
|
self.servers.retain(|s| s.name != name);
|
||
|
|
self.servers.len() < len
|
||
|
|
}
|
||
|
|
|
||
|
|
pub fn get_language_id(&self, name: &str) -> Option<String> {
|
||
|
|
self.servers.iter().find(|s| s.name == name).map(|s| s.language_id.clone())
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
impl Default for LspManager {
|
||
|
|
fn default() -> Self {
|
||
|
|
Self::new()
|
||
|
|
}
|
||
|
|
}
|