use std::path::Path;
use anyhow::Result;
use crate::lsp;
use super::LspCoordinator;
impl LspCoordinator {
pub fn did_open(
&mut self,
client_key: &str,
lang_name: &str,
path: &Path,
text: &str,
) -> Result<()> {
let uri = lsp::path_to_uri(path);
let already_open = self
.open_uris
.get(&uri)
.is_some_and(|keys| keys.iter().any(|k| k == client_key));
if !already_open && let Some(client) = self.clients.get_mut(client_key) {
client.did_open(&uri, text)?;
self.open_uris
.entry(uri.clone())
.or_default()
.push(client_key.to_string());
}
self.current_uri = Some(uri);
self.current_language = Some(lang_name.to_string());
self.add_current_client(client_key);
Ok(())
}
pub fn did_change(&mut self, text: &str) -> Result<()> {
let Some(uri) = self.current_uri.clone() else {
return Ok(());
};
let keys = self.current_clients.clone();
for key in &keys {
if let Some(client) = self.clients.get_mut(key) {
client.did_change(&uri, text)?;
}
}
Ok(())
}
pub fn did_save(&mut self, text: &str) -> Result<()> {
let Some(uri) = self.current_uri.clone() else {
return Ok(());
};
let keys = self.current_clients.clone();
for key in &keys {
if let Some(client) = self.clients.get_mut(key) {
client.did_save(&uri, text)?;
}
}
Ok(())
}
}