use crate::jsonrpc::Result;
use crate::{lock_registry, update_diagnostics};
use lsp_types_max::*;
use std::collections::HashMap;
use std::str::FromStr;
pub async fn diagnostic(
_params: DocumentDiagnosticParams,
) -> Result<DocumentDiagnosticReportResult> {
let mut registry = lock_registry()?;
update_diagnostics(&mut registry);
let requested_uri = _params.text_document.uri;
let requested_path = requested_uri.path();
let mut items = Vec::new();
for diag in registry.diagnostics.values() {
let is_relevant = if diag.doc_routes.is_empty() {
true } else {
diag.doc_routes.iter().any(|route| {
requested_path.as_str().ends_with(&route.path)
|| route.path == requested_path.as_str()
})
};
if is_relevant {
items.push(diag.lsp.clone());
}
}
Ok(DocumentDiagnosticReportResult::Report(
DocumentDiagnosticReport::Full(RelatedFullDocumentDiagnosticReport {
related_documents: None,
full_document_diagnostic_report: FullDocumentDiagnosticReport {
result_id: None, items,
},
}),
))
}
pub async fn workspace_diagnostic(
_params: WorkspaceDiagnosticParams,
) -> Result<WorkspaceDiagnosticReportResult> {
let mut registry = lock_registry()?;
update_diagnostics(&mut registry);
let mut reports = Vec::new();
let mut global_items = Vec::new();
let mut uri_to_items: HashMap<Uri, Vec<Diagnostic>> = HashMap::new();
for diag in registry.diagnostics.values() {
if diag.doc_routes.is_empty() {
global_items.push(diag.lsp.clone());
} else {
for route in &diag.doc_routes {
if let Ok(uri) = Uri::from_str(&format!("file://{}", route.path)) {
uri_to_items.entry(uri).or_default().push(diag.lsp.clone());
} else {
global_items.push(diag.lsp.clone());
}
}
}
}
for (uri, items) in uri_to_items {
reports.push(WorkspaceDocumentDiagnosticReport::Full(
WorkspaceFullDocumentDiagnosticReport {
uri,
version: None,
full_document_diagnostic_report: FullDocumentDiagnosticReport {
result_id: None,
items,
},
},
));
}
if reports.is_empty() && !global_items.is_empty() {
if let Ok(root_uri) = Uri::from_str(&format!("file://{}", registry.root_path.display())) {
reports.push(WorkspaceDocumentDiagnosticReport::Full(
WorkspaceFullDocumentDiagnosticReport {
uri: root_uri,
version: None,
full_document_diagnostic_report: FullDocumentDiagnosticReport {
result_id: None,
items: global_items,
},
},
));
}
}
Ok(WorkspaceDiagnosticReportResult::Report(
WorkspaceDiagnosticReport { items: reports },
))
}
pub async fn work_done_progress_cancel(_params: WorkDoneProgressCancelParams) {}
pub async fn set_trace(_params: SetTraceParams) {}
pub async fn progress(_params: ProgressParams) {}