use lsp_types::{ClientCapabilities, MarkupKind}; pub trait ClientCapabilitiesExt { fn has_definition_link_support(&self) -> bool; fn has_hierarchical_document_symbol_support(&self) -> bool; fn has_work_done_progress_support(&self) -> bool; fn has_hover_markdown_support(&self) -> bool; fn has_pull_configuration_support(&self) -> bool; fn has_push_configuration_support(&self) -> bool; fn has_file_watching_support(&self) -> bool; } impl ClientCapabilitiesExt for ClientCapabilities { fn has_definition_link_support(&self) -> bool { self.text_document .as_ref() .and_then(|cap| cap.definition.as_ref()) .and_then(|cap| cap.link_support) == Some(true) } fn has_hierarchical_document_symbol_support(&self) -> bool { self.text_document .as_ref() .and_then(|cap| cap.document_symbol.as_ref()) .and_then(|cap| cap.hierarchical_document_symbol_support) == Some(true) } fn has_work_done_progress_support(&self) -> bool { self.window.as_ref().and_then(|cap| cap.work_done_progress) == Some(true) } fn has_hover_markdown_support(&self) -> bool { self.text_document .as_ref() .and_then(|cap| cap.hover.as_ref()) .and_then(|cap| cap.content_format.as_ref()) .filter(|formats| formats.contains(&MarkupKind::Markdown)) .is_some() } fn has_pull_configuration_support(&self) -> bool { self.workspace.as_ref().and_then(|cap| cap.configuration) == Some(true) } fn has_push_configuration_support(&self) -> bool { self.workspace .as_ref() .and_then(|cap| cap.did_change_configuration) .and_then(|cap| cap.dynamic_registration) == Some(true) } fn has_file_watching_support(&self) -> bool { self.workspace .as_ref() .and_then(|cap| cap.did_change_watched_files) .and_then(|cap| cap.dynamic_registration) == Some(true) } } #[cfg(test)] mod tests { use super::*; use lsp_types::{ DocumentSymbolClientCapabilities, GotoCapability, HoverClientCapabilities, TextDocumentClientCapabilities, WindowClientCapabilities, }; #[test] fn test_has_definition_link_support_true() { let capabilities = ClientCapabilities { text_document: Some(TextDocumentClientCapabilities { definition: Some(GotoCapability { link_support: Some(true), ..GotoCapability::default() }), ..TextDocumentClientCapabilities::default() }), ..ClientCapabilities::default() }; assert!(capabilities.has_definition_link_support()); } #[test] fn test_has_definition_link_support_false() { let capabilities = ClientCapabilities::default(); assert!(!capabilities.has_definition_link_support()); } #[test] fn test_has_hierarchical_document_symbol_support_true() { let capabilities = ClientCapabilities { text_document: Some(TextDocumentClientCapabilities { document_symbol: Some(DocumentSymbolClientCapabilities { hierarchical_document_symbol_support: Some(true), ..DocumentSymbolClientCapabilities::default() }), ..TextDocumentClientCapabilities::default() }), ..ClientCapabilities::default() }; assert!(capabilities.has_hierarchical_document_symbol_support()); } #[test] fn test_has_hierarchical_document_symbol_support_false() { let capabilities = ClientCapabilities::default(); assert!(!capabilities.has_hierarchical_document_symbol_support()); } #[test] fn test_has_work_done_progress_support_true() { let capabilities = ClientCapabilities { window: Some(WindowClientCapabilities { work_done_progress: Some(true), ..WindowClientCapabilities::default() }), ..ClientCapabilities::default() }; assert!(capabilities.has_work_done_progress_support()); } #[test] fn test_has_work_done_progress_support_false() { let capabilities = ClientCapabilities::default(); assert!(!capabilities.has_work_done_progress_support()); } #[test] fn test_has_hover_markdown_support_true() { let capabilities = ClientCapabilities { text_document: Some(TextDocumentClientCapabilities { hover: Some(HoverClientCapabilities { content_format: Some(vec![MarkupKind::PlainText, MarkupKind::Markdown]), ..HoverClientCapabilities::default() }), ..TextDocumentClientCapabilities::default() }), ..ClientCapabilities::default() }; assert!(capabilities.has_hover_markdown_support()); } #[test] fn test_has_hover_markdown_support_false() { let capabilities = ClientCapabilities::default(); assert!(!capabilities.has_hover_markdown_support()); } }