use crate::types::DocumentUri;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub workspace: Option<WorkspaceClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text_document: Option<TextDocumentClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notebook_document: Option<NotebookDocumentClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub window: Option<WindowClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub general: Option<GeneralClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub experimental: Option<serde_json::Value>,
}
impl Default for ClientCapabilities {
fn default() -> Self {
Self {
workspace: Some(WorkspaceClientCapabilities::default()),
text_document: Some(TextDocumentClientCapabilities::default()),
notebook_document: None,
window: Some(WindowClientCapabilities::default()),
general: Some(GeneralClientCapabilities::default()),
experimental: None,
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct WorkspaceClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub apply_edit: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub workspace_edit: Option<WorkspaceEditClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub did_change_configuration: Option<DidChangeConfigurationClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub did_change_watched_files: Option<DidChangeWatchedFilesClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub symbol: Option<WorkspaceSymbolClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub execute_command: Option<ExecuteCommandClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub workspace_folders: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub configuration: Option<bool>,
}
impl Default for WorkspaceClientCapabilities {
fn default() -> Self {
Self {
apply_edit: Some(true),
workspace_edit: Some(WorkspaceEditClientCapabilities::default()),
did_change_configuration: Some(DidChangeConfigurationClientCapabilities {
dynamic_registration: Some(false),
}),
did_change_watched_files: Some(DidChangeWatchedFilesClientCapabilities {
dynamic_registration: Some(false),
}),
symbol: None,
execute_command: Some(ExecuteCommandClientCapabilities {
dynamic_registration: Some(false),
}),
workspace_folders: Some(true),
configuration: Some(true),
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct WorkspaceEditClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub document_changes: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resource_operations: Option<Vec<ResourceOperationKind>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub failure_handling: Option<FailureHandlingKind>,
#[serde(skip_serializing_if = "Option::is_none")]
pub normalizes_line_endings: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub change_annotation_support: Option<ChangeAnnotationsSupportOptions>,
}
impl Default for WorkspaceEditClientCapabilities {
fn default() -> Self {
Self {
document_changes: Some(true),
resource_operations: Some(vec![
ResourceOperationKind::Create,
ResourceOperationKind::Rename,
ResourceOperationKind::Delete,
]),
failure_handling: Some(FailureHandlingKind::Transactional),
normalizes_line_endings: Some(false),
change_annotation_support: None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ResourceOperationKind {
Create,
Rename,
Delete,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum FailureHandlingKind {
Abort,
Transactional,
TextOnlyTransactional,
Undo,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ChangeAnnotationsSupportOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub groups_on_label: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct DidChangeConfigurationClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub dynamic_registration: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct DidChangeWatchedFilesClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub dynamic_registration: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct WorkspaceSymbolClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub dynamic_registration: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ExecuteCommandClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub dynamic_registration: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TextDocumentClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub synchronization: Option<TextDocumentSyncClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completion: Option<CompletionClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hover: Option<HoverClientCapabilities>,
}
impl Default for TextDocumentClientCapabilities {
fn default() -> Self {
Self {
synchronization: Some(TextDocumentSyncClientCapabilities::default()),
completion: Some(CompletionClientCapabilities::default()),
hover: Some(HoverClientCapabilities::default()),
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TextDocumentSyncClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub dynamic_registration: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub will_save: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub will_save_wait_until: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub did_save: Option<bool>,
}
impl Default for TextDocumentSyncClientCapabilities {
fn default() -> Self {
Self {
dynamic_registration: Some(false),
will_save: Some(true),
will_save_wait_until: Some(true),
did_save: Some(true),
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CompletionClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub dynamic_registration: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completion_item: Option<CompletionItemClientCapabilities>,
}
impl Default for CompletionClientCapabilities {
fn default() -> Self {
Self {
dynamic_registration: Some(false),
completion_item: Some(CompletionItemClientCapabilities::default()),
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CompletionItemClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub snippet_support: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub commit_characters_support: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub documentation_format: Option<Vec<MarkupKind>>,
}
impl Default for CompletionItemClientCapabilities {
fn default() -> Self {
Self {
snippet_support: Some(true),
commit_characters_support: Some(true),
documentation_format: Some(vec![MarkupKind::Markdown, MarkupKind::PlainText]),
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct HoverClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub dynamic_registration: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content_format: Option<Vec<MarkupKind>>,
}
impl Default for HoverClientCapabilities {
fn default() -> Self {
Self {
dynamic_registration: Some(false),
content_format: Some(vec![MarkupKind::Markdown, MarkupKind::PlainText]),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum MarkupKind {
PlainText,
Markdown,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct NotebookDocumentClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub synchronization: Option<NotebookDocumentSyncClientCapabilities>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct NotebookDocumentSyncClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub dynamic_registration: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub execution_summary_support: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct WindowClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub work_done_progress: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub show_message: Option<ShowMessageRequestClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub show_document: Option<ShowDocumentClientCapabilities>,
}
impl Default for WindowClientCapabilities {
fn default() -> Self {
Self {
work_done_progress: Some(true),
show_message: None,
show_document: None,
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ShowMessageRequestClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub message_action_item: Option<MessageActionItemClientCapabilities>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MessageActionItemClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub additional_properties_support: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ShowDocumentClientCapabilities {
pub support: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GeneralClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub regular_expressions: Option<RegularExpressionsClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub markdown: Option<MarkdownClientCapabilities>,
}
impl Default for GeneralClientCapabilities {
fn default() -> Self {
Self {
regular_expressions: Some(RegularExpressionsClientCapabilities {
engine: "ECMAScript".to_string(),
version: Some("ES2020".to_string()),
}),
markdown: Some(MarkdownClientCapabilities {
parser: "marked".to_string(),
version: Some("1.1.0".to_string()),
}),
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RegularExpressionsClientCapabilities {
pub engine: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MarkdownClientCapabilities {
pub parser: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct InitializeParams {
pub process_id: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_info: Option<ClientInfo>,
#[serde(skip_serializing_if = "Option::is_none")]
pub locale: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub root_path: Option<String>,
pub root_uri: Option<DocumentUri>,
#[serde(skip_serializing_if = "Option::is_none")]
pub initialization_options: Option<serde_json::Value>,
pub capabilities: ClientCapabilities,
#[serde(skip_serializing_if = "Option::is_none")]
pub trace: Option<TraceValue>,
#[serde(skip_serializing_if = "Option::is_none")]
pub workspace_folders: Option<Vec<WorkspaceFolder>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ClientInfo {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum TraceValue {
Off,
Messages,
Verbose,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct WorkspaceFolder {
pub uri: DocumentUri,
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct InitializeResult {
pub capabilities: ServerCapabilities,
#[serde(skip_serializing_if = "Option::is_none")]
pub server_info: Option<ServerInfo>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ServerInfo {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ServerCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub text_document_sync: Option<TextDocumentSyncCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completion_provider: Option<CompletionOptions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hover_provider: Option<HoverProviderCapability>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum TextDocumentSyncCapability {
Kind(TextDocumentSyncKind),
Options(TextDocumentSyncOptions),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[repr(u8)]
pub enum TextDocumentSyncKind {
None = 0,
Full = 1,
Incremental = 2,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TextDocumentSyncOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub open_close: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub change: Option<TextDocumentSyncKind>,
#[serde(skip_serializing_if = "Option::is_none")]
pub will_save: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub will_save_wait_until: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub save: Option<SaveOptions>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SaveOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub include_text: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct CompletionOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub resolve_provider: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub trigger_characters: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub all_commit_characters: Option<Vec<String>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum HoverProviderCapability {
Simple(bool),
Options(HoverOptions),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct HoverOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub work_done_progress: Option<bool>,
}