1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5use crate::{
6 Diagnostic, PartialResultParams, StaticRegistrationOptions, TextDocumentIdentifier,
7 TextDocumentRegistrationOptions, Uri, WorkDoneProgressOptions, WorkDoneProgressParams,
8 macros::lsp_enum,
9};
10
11#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
15#[serde(rename_all = "camelCase")]
16pub struct DiagnosticClientCapabilities {
17 #[serde(skip_serializing_if = "Option::is_none")]
22 pub dynamic_registration: Option<bool>,
23
24 #[serde(skip_serializing_if = "Option::is_none")]
26 pub related_document_support: Option<bool>,
27
28 #[serde(skip_serializing_if = "Option::is_none")]
30 pub related_information: Option<bool>,
31
32 #[serde(skip_serializing_if = "Option::is_none")]
35 pub tag_support: Option<ClientDiagnosticsTagOptions>,
36
37 #[serde(skip_serializing_if = "Option::is_none")]
39 pub code_description_support: Option<bool>,
40
41 #[serde(skip_serializing_if = "Option::is_none")]
44 pub data_support: Option<bool>,
45}
46
47#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
49#[serde(rename_all = "camelCase")]
50pub struct ClientDiagnosticsTagOptions {
51 value_set: Vec<DiagnosticTag>,
53}
54
55#[derive(Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
59#[serde(transparent)]
60pub struct DiagnosticTag(u32);
61
62lsp_enum! {
63 impl DiagnosticTag {
64 const UNNECESSARY = 1;
69 const DEPRECATED = 2;
73 }
74}
75
76#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
80#[serde(rename_all = "camelCase")]
81pub struct DiagnosticOptions {
82 #[serde(skip_serializing_if = "Option::is_none")]
85 pub identifier: Option<String>,
86
87 pub inter_file_dependencies: bool,
91
92 pub workspace_diagnostics: bool,
94
95 #[serde(flatten)]
96 pub work_done_progress_options: WorkDoneProgressOptions,
97}
98
99#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
103#[serde(rename_all = "camelCase")]
104pub struct DiagnosticRegistrationOptions {
105 #[serde(flatten)]
106 pub text_document_registration_options: TextDocumentRegistrationOptions,
107
108 #[serde(flatten)]
109 pub diagnostic_options: DiagnosticOptions,
110
111 #[serde(flatten)]
112 pub static_registration_options: StaticRegistrationOptions,
113}
114
115#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
116#[serde(untagged)]
117pub enum DiagnosticServerCapabilities {
118 Options(DiagnosticOptions),
119 RegistrationOptions(DiagnosticRegistrationOptions),
120}
121
122#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
126#[serde(rename_all = "camelCase")]
127pub struct DocumentDiagnosticParams {
128 pub text_document: TextDocumentIdentifier,
130
131 pub identifier: Option<String>,
133
134 pub previous_result_id: Option<String>,
136
137 #[serde(flatten)]
138 pub work_done_progress_params: WorkDoneProgressParams,
139
140 #[serde(flatten)]
141 pub partial_result_params: PartialResultParams,
142}
143
144#[derive(Debug, PartialEq, Eq, Default, Deserialize, Serialize, Clone)]
148#[serde(rename_all = "camelCase")]
149pub struct FullDocumentDiagnosticReport {
150 #[serde(skip_serializing_if = "Option::is_none")]
153 pub result_id: Option<String>,
154
155 pub items: Vec<Diagnostic>,
157}
158
159#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, Clone)]
165#[serde(rename_all = "camelCase")]
166pub struct UnchangedDocumentDiagnosticReport {
167 pub result_id: String,
169}
170
171#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, Clone)]
175#[serde(tag = "kind", rename_all = "lowercase")]
176pub enum DocumentDiagnosticReportKind {
177 Full(FullDocumentDiagnosticReport),
179 Unchanged(UnchangedDocumentDiagnosticReport),
181}
182
183impl From<FullDocumentDiagnosticReport> for DocumentDiagnosticReportKind {
184 fn from(from: FullDocumentDiagnosticReport) -> Self {
185 Self::Full(from)
186 }
187}
188
189impl From<UnchangedDocumentDiagnosticReport> for DocumentDiagnosticReportKind {
190 fn from(from: UnchangedDocumentDiagnosticReport) -> Self {
191 Self::Unchanged(from)
192 }
193}
194
195#[derive(Debug, PartialEq, Eq, Default, Deserialize, Serialize, Clone)]
199#[serde(rename_all = "camelCase")]
200pub struct RelatedFullDocumentDiagnosticReport {
201 #[serde(skip_serializing_if = "Option::is_none")]
209 #[serde(default)]
210 pub related_documents: Option<HashMap<Uri, DocumentDiagnosticReportKind>>,
211 #[serde(flatten)]
213 pub full_document_diagnostic_report: FullDocumentDiagnosticReport,
214}
215
216#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, Clone)]
220#[serde(rename_all = "camelCase")]
221pub struct RelatedUnchangedDocumentDiagnosticReport {
222 #[serde(skip_serializing_if = "Option::is_none")]
230 #[serde(default)]
231 pub related_documents: Option<HashMap<Uri, DocumentDiagnosticReportKind>>,
232 #[serde(flatten)]
234 pub unchanged_document_diagnostic_report: UnchangedDocumentDiagnosticReport,
235}
236
237#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, Clone)]
245#[serde(tag = "kind", rename_all = "lowercase")]
246pub enum DocumentDiagnosticReport {
247 Full(RelatedFullDocumentDiagnosticReport),
249 Unchanged(RelatedUnchangedDocumentDiagnosticReport),
251}
252
253impl From<RelatedFullDocumentDiagnosticReport> for DocumentDiagnosticReport {
254 fn from(from: RelatedFullDocumentDiagnosticReport) -> Self {
255 Self::Full(from)
256 }
257}
258
259impl From<RelatedUnchangedDocumentDiagnosticReport> for DocumentDiagnosticReport {
260 fn from(from: RelatedUnchangedDocumentDiagnosticReport) -> Self {
261 Self::Unchanged(from)
262 }
263}
264
265#[derive(Debug, PartialEq, Eq, Default, Deserialize, Serialize, Clone)]
269#[serde(rename_all = "camelCase")]
270pub struct DocumentDiagnosticReportPartialResult {
271 #[serde(skip_serializing_if = "Option::is_none")]
272 #[serde(default)]
273 pub related_documents: Option<HashMap<Uri, DocumentDiagnosticReportKind>>,
274 }
276
277#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, Clone)]
278#[serde(untagged)]
279pub enum DocumentDiagnosticReportResult {
280 Report(DocumentDiagnosticReport),
281 Partial(DocumentDiagnosticReportPartialResult),
282}
283
284impl From<DocumentDiagnosticReport> for DocumentDiagnosticReportResult {
285 fn from(from: DocumentDiagnosticReport) -> Self {
286 Self::Report(from)
287 }
288}
289
290impl From<DocumentDiagnosticReportPartialResult> for DocumentDiagnosticReportResult {
291 fn from(from: DocumentDiagnosticReportPartialResult) -> Self {
292 Self::Partial(from)
293 }
294}
295
296#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, Clone)]
302#[serde(rename_all = "camelCase")]
303pub struct DiagnosticServerCancellationData {
304 pub retrigger_request: bool,
305}
306
307impl Default for DiagnosticServerCancellationData {
308 fn default() -> Self {
309 Self {
310 retrigger_request: true,
311 }
312 }
313}