1use crate::types::DocumentUri;
7use serde::{Deserialize, Serialize};
8
9#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
11pub struct ClientCapabilities {
12 #[serde(skip_serializing_if = "Option::is_none")]
14 pub workspace: Option<WorkspaceClientCapabilities>,
15
16 #[serde(skip_serializing_if = "Option::is_none")]
18 pub text_document: Option<TextDocumentClientCapabilities>,
19
20 #[serde(skip_serializing_if = "Option::is_none")]
22 pub notebook_document: Option<NotebookDocumentClientCapabilities>,
23
24 #[serde(skip_serializing_if = "Option::is_none")]
26 pub window: Option<WindowClientCapabilities>,
27
28 #[serde(skip_serializing_if = "Option::is_none")]
30 pub general: Option<GeneralClientCapabilities>,
31
32 #[serde(skip_serializing_if = "Option::is_none")]
34 pub experimental: Option<serde_json::Value>,
35}
36
37impl Default for ClientCapabilities {
38 fn default() -> Self {
39 Self {
40 workspace: Some(WorkspaceClientCapabilities::default()),
41 text_document: Some(TextDocumentClientCapabilities::default()),
42 notebook_document: None,
43 window: Some(WindowClientCapabilities::default()),
44 general: Some(GeneralClientCapabilities::default()),
45 experimental: None,
46 }
47 }
48}
49
50#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
52pub struct WorkspaceClientCapabilities {
53 #[serde(skip_serializing_if = "Option::is_none")]
55 pub apply_edit: Option<bool>,
56
57 #[serde(skip_serializing_if = "Option::is_none")]
59 pub workspace_edit: Option<WorkspaceEditClientCapabilities>,
60
61 #[serde(skip_serializing_if = "Option::is_none")]
63 pub did_change_configuration: Option<DidChangeConfigurationClientCapabilities>,
64
65 #[serde(skip_serializing_if = "Option::is_none")]
67 pub did_change_watched_files: Option<DidChangeWatchedFilesClientCapabilities>,
68
69 #[serde(skip_serializing_if = "Option::is_none")]
71 pub symbol: Option<WorkspaceSymbolClientCapabilities>,
72
73 #[serde(skip_serializing_if = "Option::is_none")]
75 pub execute_command: Option<ExecuteCommandClientCapabilities>,
76
77 #[serde(skip_serializing_if = "Option::is_none")]
79 pub workspace_folders: Option<bool>,
80
81 #[serde(skip_serializing_if = "Option::is_none")]
83 pub configuration: Option<bool>,
84}
85
86impl Default for WorkspaceClientCapabilities {
87 fn default() -> Self {
88 Self {
89 apply_edit: Some(true),
90 workspace_edit: Some(WorkspaceEditClientCapabilities::default()),
91 did_change_configuration: Some(DidChangeConfigurationClientCapabilities {
92 dynamic_registration: Some(false),
93 }),
94 did_change_watched_files: Some(DidChangeWatchedFilesClientCapabilities {
95 dynamic_registration: Some(false),
96 }),
97 symbol: None,
98 execute_command: Some(ExecuteCommandClientCapabilities {
99 dynamic_registration: Some(false),
100 }),
101 workspace_folders: Some(true),
102 configuration: Some(true),
103 }
104 }
105}
106
107#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
109pub struct WorkspaceEditClientCapabilities {
110 #[serde(skip_serializing_if = "Option::is_none")]
112 pub document_changes: Option<bool>,
113
114 #[serde(skip_serializing_if = "Option::is_none")]
116 pub resource_operations: Option<Vec<ResourceOperationKind>>,
117
118 #[serde(skip_serializing_if = "Option::is_none")]
120 pub failure_handling: Option<FailureHandlingKind>,
121
122 #[serde(skip_serializing_if = "Option::is_none")]
124 pub normalizes_line_endings: Option<bool>,
125
126 #[serde(skip_serializing_if = "Option::is_none")]
129 pub change_annotation_support: Option<ChangeAnnotationsSupportOptions>,
130}
131
132impl Default for WorkspaceEditClientCapabilities {
133 fn default() -> Self {
134 Self {
135 document_changes: Some(true),
136 resource_operations: Some(vec![
137 ResourceOperationKind::Create,
138 ResourceOperationKind::Rename,
139 ResourceOperationKind::Delete,
140 ]),
141 failure_handling: Some(FailureHandlingKind::Transactional),
142 normalizes_line_endings: Some(false),
143 change_annotation_support: None,
144 }
145 }
146}
147
148#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
150#[serde(rename_all = "lowercase")]
151pub enum ResourceOperationKind {
152 Create,
154 Rename,
156 Delete,
158}
159
160#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
162#[serde(rename_all = "camelCase")]
163pub enum FailureHandlingKind {
164 Abort,
168 Transactional,
171 TextOnlyTransactional,
175 Undo,
178}
179
180#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
182pub struct ChangeAnnotationsSupportOptions {
183 #[serde(skip_serializing_if = "Option::is_none")]
185 pub groups_on_label: Option<bool>,
186}
187
188#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
190pub struct DidChangeConfigurationClientCapabilities {
191 #[serde(skip_serializing_if = "Option::is_none")]
193 pub dynamic_registration: Option<bool>,
194}
195
196#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
198pub struct DidChangeWatchedFilesClientCapabilities {
199 #[serde(skip_serializing_if = "Option::is_none")]
201 pub dynamic_registration: Option<bool>,
202}
203
204#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
206pub struct WorkspaceSymbolClientCapabilities {
207 #[serde(skip_serializing_if = "Option::is_none")]
209 pub dynamic_registration: Option<bool>,
210}
211
212#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
214pub struct ExecuteCommandClientCapabilities {
215 #[serde(skip_serializing_if = "Option::is_none")]
217 pub dynamic_registration: Option<bool>,
218}
219
220#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
222pub struct TextDocumentClientCapabilities {
223 #[serde(skip_serializing_if = "Option::is_none")]
225 pub synchronization: Option<TextDocumentSyncClientCapabilities>,
226
227 #[serde(skip_serializing_if = "Option::is_none")]
229 pub completion: Option<CompletionClientCapabilities>,
230
231 #[serde(skip_serializing_if = "Option::is_none")]
233 pub hover: Option<HoverClientCapabilities>,
234}
235
236impl Default for TextDocumentClientCapabilities {
237 fn default() -> Self {
238 Self {
239 synchronization: Some(TextDocumentSyncClientCapabilities::default()),
240 completion: Some(CompletionClientCapabilities::default()),
241 hover: Some(HoverClientCapabilities::default()),
242 }
243 }
244}
245
246#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
248pub struct TextDocumentSyncClientCapabilities {
249 #[serde(skip_serializing_if = "Option::is_none")]
251 pub dynamic_registration: Option<bool>,
252
253 #[serde(skip_serializing_if = "Option::is_none")]
255 pub will_save: Option<bool>,
256
257 #[serde(skip_serializing_if = "Option::is_none")]
260 pub will_save_wait_until: Option<bool>,
261
262 #[serde(skip_serializing_if = "Option::is_none")]
264 pub did_save: Option<bool>,
265}
266
267impl Default for TextDocumentSyncClientCapabilities {
268 fn default() -> Self {
269 Self {
270 dynamic_registration: Some(false),
271 will_save: Some(true),
272 will_save_wait_until: Some(true),
273 did_save: Some(true),
274 }
275 }
276}
277
278#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
280pub struct CompletionClientCapabilities {
281 #[serde(skip_serializing_if = "Option::is_none")]
283 pub dynamic_registration: Option<bool>,
284
285 #[serde(skip_serializing_if = "Option::is_none")]
287 pub completion_item: Option<CompletionItemClientCapabilities>,
288}
289
290impl Default for CompletionClientCapabilities {
291 fn default() -> Self {
292 Self {
293 dynamic_registration: Some(false),
294 completion_item: Some(CompletionItemClientCapabilities::default()),
295 }
296 }
297}
298
299#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
301pub struct CompletionItemClientCapabilities {
302 #[serde(skip_serializing_if = "Option::is_none")]
304 pub snippet_support: Option<bool>,
305
306 #[serde(skip_serializing_if = "Option::is_none")]
308 pub commit_characters_support: Option<bool>,
309
310 #[serde(skip_serializing_if = "Option::is_none")]
313 pub documentation_format: Option<Vec<MarkupKind>>,
314}
315
316impl Default for CompletionItemClientCapabilities {
317 fn default() -> Self {
318 Self {
319 snippet_support: Some(true),
320 commit_characters_support: Some(true),
321 documentation_format: Some(vec![MarkupKind::Markdown, MarkupKind::PlainText]),
322 }
323 }
324}
325
326#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
328pub struct HoverClientCapabilities {
329 #[serde(skip_serializing_if = "Option::is_none")]
331 pub dynamic_registration: Option<bool>,
332
333 #[serde(skip_serializing_if = "Option::is_none")]
336 pub content_format: Option<Vec<MarkupKind>>,
337}
338
339impl Default for HoverClientCapabilities {
340 fn default() -> Self {
341 Self {
342 dynamic_registration: Some(false),
343 content_format: Some(vec![MarkupKind::Markdown, MarkupKind::PlainText]),
344 }
345 }
346}
347
348#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
350#[serde(rename_all = "lowercase")]
351pub enum MarkupKind {
352 PlainText,
354 Markdown,
356}
357
358#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
360pub struct NotebookDocumentClientCapabilities {
361 #[serde(skip_serializing_if = "Option::is_none")]
363 pub synchronization: Option<NotebookDocumentSyncClientCapabilities>,
364}
365
366#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
368pub struct NotebookDocumentSyncClientCapabilities {
369 #[serde(skip_serializing_if = "Option::is_none")]
371 pub dynamic_registration: Option<bool>,
372
373 #[serde(skip_serializing_if = "Option::is_none")]
375 pub execution_summary_support: Option<bool>,
376}
377
378#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
380pub struct WindowClientCapabilities {
381 #[serde(skip_serializing_if = "Option::is_none")]
384 pub work_done_progress: Option<bool>,
385
386 #[serde(skip_serializing_if = "Option::is_none")]
388 pub show_message: Option<ShowMessageRequestClientCapabilities>,
389
390 #[serde(skip_serializing_if = "Option::is_none")]
392 pub show_document: Option<ShowDocumentClientCapabilities>,
393}
394
395impl Default for WindowClientCapabilities {
396 fn default() -> Self {
397 Self {
398 work_done_progress: Some(true),
399 show_message: None,
400 show_document: None,
401 }
402 }
403}
404
405#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
407pub struct ShowMessageRequestClientCapabilities {
408 #[serde(skip_serializing_if = "Option::is_none")]
410 pub message_action_item: Option<MessageActionItemClientCapabilities>,
411}
412
413#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
415pub struct MessageActionItemClientCapabilities {
416 #[serde(skip_serializing_if = "Option::is_none")]
420 pub additional_properties_support: Option<bool>,
421}
422
423#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
425pub struct ShowDocumentClientCapabilities {
426 pub support: bool,
428}
429
430#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
432pub struct GeneralClientCapabilities {
433 #[serde(skip_serializing_if = "Option::is_none")]
435 pub regular_expressions: Option<RegularExpressionsClientCapabilities>,
436
437 #[serde(skip_serializing_if = "Option::is_none")]
439 pub markdown: Option<MarkdownClientCapabilities>,
440}
441
442impl Default for GeneralClientCapabilities {
443 fn default() -> Self {
444 Self {
445 regular_expressions: Some(RegularExpressionsClientCapabilities {
446 engine: "ECMAScript".to_string(),
447 version: Some("ES2020".to_string()),
448 }),
449 markdown: Some(MarkdownClientCapabilities {
450 parser: "marked".to_string(),
451 version: Some("1.1.0".to_string()),
452 }),
453 }
454 }
455}
456
457#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
459pub struct RegularExpressionsClientCapabilities {
460 pub engine: String,
462
463 #[serde(skip_serializing_if = "Option::is_none")]
465 pub version: Option<String>,
466}
467
468#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
470pub struct MarkdownClientCapabilities {
471 pub parser: String,
473
474 #[serde(skip_serializing_if = "Option::is_none")]
476 pub version: Option<String>,
477}
478
479#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
481pub struct InitializeParams {
482 pub process_id: Option<u32>,
484
485 #[serde(skip_serializing_if = "Option::is_none")]
487 pub client_info: Option<ClientInfo>,
488
489 #[serde(skip_serializing_if = "Option::is_none")]
491 pub locale: Option<String>,
492
493 #[serde(skip_serializing_if = "Option::is_none")]
495 pub root_path: Option<String>,
496
497 pub root_uri: Option<DocumentUri>,
499
500 #[serde(skip_serializing_if = "Option::is_none")]
502 pub initialization_options: Option<serde_json::Value>,
503
504 pub capabilities: ClientCapabilities,
506
507 #[serde(skip_serializing_if = "Option::is_none")]
509 pub trace: Option<TraceValue>,
510
511 #[serde(skip_serializing_if = "Option::is_none")]
513 pub workspace_folders: Option<Vec<WorkspaceFolder>>,
514}
515
516#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
518pub struct ClientInfo {
519 pub name: String,
521
522 #[serde(skip_serializing_if = "Option::is_none")]
524 pub version: Option<String>,
525}
526
527#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
529#[serde(rename_all = "lowercase")]
530pub enum TraceValue {
531 Off,
533 Messages,
535 Verbose,
537}
538
539#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
541pub struct WorkspaceFolder {
542 pub uri: DocumentUri,
544
545 pub name: String,
547}
548
549#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
551pub struct InitializeResult {
552 pub capabilities: ServerCapabilities,
554
555 #[serde(skip_serializing_if = "Option::is_none")]
557 pub server_info: Option<ServerInfo>,
558}
559
560#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
562pub struct ServerInfo {
563 pub name: String,
565
566 #[serde(skip_serializing_if = "Option::is_none")]
568 pub version: Option<String>,
569}
570
571#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
573pub struct ServerCapabilities {
574 #[serde(skip_serializing_if = "Option::is_none")]
576 pub text_document_sync: Option<TextDocumentSyncCapability>,
577
578 #[serde(skip_serializing_if = "Option::is_none")]
580 pub completion_provider: Option<CompletionOptions>,
581
582 #[serde(skip_serializing_if = "Option::is_none")]
584 pub hover_provider: Option<HoverProviderCapability>,
585}
586
587#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
589#[serde(untagged)]
590pub enum TextDocumentSyncCapability {
591 Kind(TextDocumentSyncKind),
592 Options(TextDocumentSyncOptions),
593}
594
595#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
597#[repr(u8)]
598pub enum TextDocumentSyncKind {
599 None = 0,
601 Full = 1,
603 Incremental = 2,
605}
606
607#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
609pub struct TextDocumentSyncOptions {
610 #[serde(skip_serializing_if = "Option::is_none")]
612 pub open_close: Option<bool>,
613
614 #[serde(skip_serializing_if = "Option::is_none")]
616 pub change: Option<TextDocumentSyncKind>,
617
618 #[serde(skip_serializing_if = "Option::is_none")]
620 pub will_save: Option<bool>,
621
622 #[serde(skip_serializing_if = "Option::is_none")]
624 pub will_save_wait_until: Option<bool>,
625
626 #[serde(skip_serializing_if = "Option::is_none")]
628 pub save: Option<SaveOptions>,
629}
630
631#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
633pub struct SaveOptions {
634 #[serde(skip_serializing_if = "Option::is_none")]
636 pub include_text: Option<bool>,
637}
638
639#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
641pub struct CompletionOptions {
642 #[serde(skip_serializing_if = "Option::is_none")]
644 pub resolve_provider: Option<bool>,
645
646 #[serde(skip_serializing_if = "Option::is_none")]
649 pub trigger_characters: Option<Vec<String>>,
650
651 #[serde(skip_serializing_if = "Option::is_none")]
653 pub all_commit_characters: Option<Vec<String>>,
654}
655
656#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
658#[serde(untagged)]
659pub enum HoverProviderCapability {
660 Simple(bool),
661 Options(HoverOptions),
662}
663
664#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
666pub struct HoverOptions {
667 #[serde(skip_serializing_if = "Option::is_none")]
668 pub work_done_progress: Option<bool>,
669}