1#![allow(non_upper_case_globals)]
18
19#[macro_use]
20extern crate bitflags;
21#[macro_use]
22extern crate num_derive;
23extern crate num_traits;
24extern crate serde;
25#[macro_use]
26extern crate serde_derive;
27extern crate serde_json;
28
29extern crate url;
30extern crate url_serde;
31
32pub use url::Url;
33
34use std::collections::HashMap;
35
36use num_traits::FromPrimitive;
37use serde::de;
38use serde::de::Error as Error_;
39use serde_json::Value;
40
41pub mod notification;
42pub mod request;
43
44#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
47#[serde(untagged)]
48pub enum NumberOrString {
49 Number(u64),
50 String(String),
51}
52
53#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
56pub struct CancelParams {
57 pub id: NumberOrString,
59}
60
61#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Copy, Clone, Default, Deserialize, Serialize)]
66pub struct Position {
67 pub line: u64,
69 pub character: u64,
71}
72
73impl Position {
74 pub fn new(line: u64, character: u64) -> Position {
75 Position {
76 line: line,
77 character: character,
78 }
79 }
80}
81
82#[derive(Debug, Eq, PartialEq, Copy, Clone, Default, Deserialize, Serialize)]
85pub struct Range {
86 pub start: Position,
88 pub end: Position,
90}
91
92impl Range {
93 pub fn new(start: Position, end: Position) -> Range {
94 Range {
95 start: start,
96 end: end,
97 }
98 }
99}
100
101#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
103pub struct Location {
104 #[serde(with = "url_serde")]
105 pub uri: Url,
106 pub range: Range,
107}
108
109impl Location {
110 pub fn new(uri: Url, range: Range) -> Location {
111 Location {
112 uri: uri,
113 range: range,
114 }
115 }
116}
117
118#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
120#[serde(rename_all = "camelCase")]
121pub struct LocationLink {
122 #[serde(skip_serializing_if = "Option::is_none")]
127 pub origin_selection_range: Option<Range>,
128
129 #[serde(with = "url_serde")]
131 pub target_uri: Url,
132
133 pub target_range: Range,
135
136 #[serde(skip_serializing_if = "Option::is_none")]
138 pub target_selection_range: Option<Range>
139}
140
141#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
144#[serde(rename_all = "camelCase")]
145pub struct Diagnostic {
146 pub range: Range,
148
149 #[serde(skip_serializing_if = "Option::is_none")]
152 pub severity: Option<DiagnosticSeverity>,
153
154 #[serde(skip_serializing_if = "Option::is_none")]
156 pub code: Option<NumberOrString>,
157 #[serde(skip_serializing_if = "Option::is_none")]
161 pub source: Option<String>,
162
163 pub message: String,
165
166 #[serde(skip_serializing_if = "Option::is_none")]
169 pub related_information: Option<Vec<DiagnosticRelatedInformation>>,
170}
171
172impl Diagnostic {
173 pub fn new(
174 range: Range,
175 severity: Option<DiagnosticSeverity>,
176 code: Option<NumberOrString>,
177 source: Option<String>,
178 message: String,
179 related_information: Option<Vec<DiagnosticRelatedInformation>>,
180 ) -> Diagnostic {
181 Diagnostic {
182 range,
183 severity,
184 code,
185 source,
186 message,
187 related_information,
188 }
189 }
190
191 pub fn new_simple(range: Range, message: String) -> Diagnostic {
192 Self::new(range, None, None, None, message, None)
193 }
194
195 pub fn new_with_code_number(
196 range: Range,
197 severity: DiagnosticSeverity,
198 code_number: u64,
199 source: Option<String>,
200 message: String,
201 ) -> Diagnostic {
202 let code = Some(NumberOrString::Number(code_number));
203 Self::new(range, Some(severity), code, source, message, None)
204 }
205}
206
207#[derive(Debug, Eq, PartialEq, Clone, Copy)]
209pub enum DiagnosticSeverity {
210 Error = 1,
212 Warning = 2,
214 Information = 3,
216 Hint = 4,
218}
219
220#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
224pub struct DiagnosticRelatedInformation {
225 pub location: Location,
227
228 pub message: String,
230}
231
232impl<'de> serde::Deserialize<'de> for DiagnosticSeverity {
233 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
234 where
235 D: serde::Deserializer<'de>,
236 {
237 Ok(match try!(u8::deserialize(deserializer)) {
238 1 => DiagnosticSeverity::Error,
239 2 => DiagnosticSeverity::Warning,
240 3 => DiagnosticSeverity::Information,
241 4 => DiagnosticSeverity::Hint,
242 i => {
243 return Err(D::Error::invalid_value(
244 de::Unexpected::Unsigned(i as u64),
245 &"value of 1, 2, 3 or 4",
246 ));
247 }
248 })
249 }
250}
251
252impl serde::Serialize for DiagnosticSeverity {
253 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
254 where
255 S: serde::Serializer,
256 {
257 serializer.serialize_u8(*self as u8)
258 }
259}
260
261#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
267pub struct Command {
268 pub title: String,
270 pub command: String,
272 #[serde(skip_serializing_if = "Option::is_none")]
275 pub arguments: Option<Vec<Value>>,
276}
277
278impl Command {
279 pub fn new(title: String, command: String, arguments: Option<Vec<Value>>) -> Command {
280 Command {
281 title: title,
282 command: command,
283 arguments: arguments,
284 }
285 }
286}
287
288#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
294#[serde(rename_all = "camelCase")]
295pub struct TextEdit {
296 pub range: Range,
299 pub new_text: String,
302}
303
304impl TextEdit {
305 pub fn new(range: Range, new_text: String) -> TextEdit {
306 TextEdit {
307 range: range,
308 new_text: new_text,
309 }
310 }
311}
312
313#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
321#[serde(rename_all = "camelCase")]
322pub struct TextDocumentEdit {
323 pub text_document: VersionedTextDocumentIdentifier,
327
328 pub edits: Vec<TextEdit>,
332}
333
334#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
338#[serde(rename_all = "camelCase")]
339pub struct CreateFileOptions {
340 #[serde(skip_serializing_if = "Option::is_none")]
344 pub overwrite: Option<bool>,
345 #[serde(skip_serializing_if = "Option::is_none")]
349 pub ignore_if_exists: Option<bool>,
350}
351
352#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
356#[serde(rename_all = "camelCase")]
357pub struct CreateFile {
358 #[serde(with = "url_serde")]
362 pub uri: Url,
363 #[serde(skip_serializing_if = "Option::is_none")]
367 pub options: Option<CreateFileOptions>,
368}
369
370#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
374#[serde(rename_all = "camelCase")]
375pub struct RenameFileOptions {
376 #[serde(skip_serializing_if = "Option::is_none")]
380 pub overwrite: Option<bool>,
381 #[serde(skip_serializing_if = "Option::is_none")]
385 pub ignore_if_exists: Option<bool>,
386}
387
388#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
392#[serde(rename_all = "camelCase")]
393pub struct RenameFile {
394 #[serde(with = "url_serde")]
398 pub old_uri: Url,
399 #[serde(with = "url_serde")]
403 pub new_uri: Url,
404 #[serde(skip_serializing_if = "Option::is_none")]
408 pub options: Option<RenameFileOptions>,
409}
410
411#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
415#[serde(rename_all = "camelCase")]
416pub struct DeleteFileOptions {
417 #[serde(skip_serializing_if = "Option::is_none")]
421 pub recursive: Option<bool>,
422 #[serde(skip_serializing_if = "Option::is_none")]
426 pub ignore_if_not_exists: Option<bool>,
427}
428
429#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
433#[serde(rename_all = "camelCase")]
434pub struct DeleteFile {
435 #[serde(with = "url_serde")]
439 pub uri: Url,
440 #[serde(skip_serializing_if = "Option::is_none")]
444 pub options: Option<DeleteFileOptions>,
445}
446
447#[derive(Debug, Eq, PartialEq, Clone, Default, Deserialize, Serialize)]
449#[serde(rename_all = "camelCase")]
450pub struct WorkspaceEdit {
451 #[serde(with = "url_map")]
453 #[serde(skip_serializing_if = "Option::is_none")]
454 #[serde(default)]
455 pub changes: Option<HashMap<Url, Vec<TextEdit>>>, #[serde(skip_serializing_if = "Option::is_none")]
470 pub document_changes: Option<DocumentChanges>,
471}
472
473#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
474#[serde(untagged)]
475pub enum DocumentChanges {
476 Edits(Vec<TextDocumentEdit>),
477 Operations(Vec<DocumentChangeOperation>),
478}
479
480#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
496#[serde(untagged, rename_all = "lowercase")]
497pub enum DocumentChangeOperation {
498 Op(ResourceOp),
499 Edit(TextDocumentEdit),
500}
501
502#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
503#[serde(tag = "kind", rename_all = "lowercase")]
504pub enum ResourceOp {
505 Create(CreateFile),
506 Rename(RenameFile),
507 Delete(DeleteFile),
508}
509
510mod url_map {
511 use super::*;
512
513 use std::fmt;
514
515 pub fn deserialize<'de, D>(
516 deserializer: D,
517 ) -> Result<Option<HashMap<Url, Vec<TextEdit>>>, D::Error>
518 where
519 D: serde::Deserializer<'de>,
520 {
521 struct UrlMapVisitor;
522 impl<'de> de::Visitor<'de> for UrlMapVisitor {
523 type Value = HashMap<Url, Vec<TextEdit>>;
524
525 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
526 formatter.write_str("map")
527 }
528
529 fn visit_map<M>(self, mut visitor: M) -> Result<Self::Value, M::Error>
530 where
531 M: de::MapAccess<'de>,
532 {
533 let mut values = HashMap::with_capacity(visitor.size_hint().unwrap_or(0));
534
535 while let Some((key, value)) = visitor.next_entry::<url_serde::De<Url>, _>()? {
538 values.insert(key.into_inner(), value);
539 }
540
541 Ok(values)
542 }
543 }
544
545 struct OptionUrlMapVisitor;
546 impl<'de> de::Visitor<'de> for OptionUrlMapVisitor {
547 type Value = Option<HashMap<Url, Vec<TextEdit>>>;
548
549 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
550 formatter.write_str("option")
551 }
552
553 #[inline]
554 fn visit_unit<E>(self) -> Result<Self::Value, E>
555 where
556 E: serde::de::Error,
557 {
558 Ok(None)
559 }
560
561 #[inline]
562 fn visit_none<E>(self) -> Result<Self::Value, E>
563 where
564 E: serde::de::Error,
565 {
566 Ok(None)
567 }
568
569 #[inline]
570 fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
571 where
572 D: serde::Deserializer<'de>,
573 {
574 deserializer.deserialize_map(UrlMapVisitor).map(Some)
575 }
576 }
577
578 deserializer.deserialize_option(OptionUrlMapVisitor)
581 }
582
583 pub fn serialize<S>(
584 changes: &Option<HashMap<Url, Vec<TextEdit>>>,
585 serializer: S,
586 ) -> Result<S::Ok, S::Error>
587 where
588 S: serde::Serializer,
589 {
590 use serde::ser::SerializeMap;
591
592 match *changes {
593 Some(ref changes) => {
594 let mut map = serializer.serialize_map(Some(changes.len()))?;
595 for (k, v) in changes {
596 map.serialize_entry(k.as_str(), v)?;
597 }
598 map.end()
599 }
600 None => serializer.serialize_none(),
601 }
602 }
603}
604
605impl WorkspaceEdit {
606 pub fn new(changes: HashMap<Url, Vec<TextEdit>>) -> WorkspaceEdit {
607 WorkspaceEdit {
608 changes: Some(changes),
609 document_changes: None,
610 }
611 }
612}
613
614#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
616pub struct TextDocumentIdentifier {
617 #[serde(with = "url_serde")]
623 pub uri: Url,
624}
625
626impl TextDocumentIdentifier {
627 pub fn new(uri: Url) -> TextDocumentIdentifier {
628 TextDocumentIdentifier { uri: uri }
629 }
630}
631
632#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
634#[serde(rename_all = "camelCase")]
635pub struct TextDocumentItem {
636 #[serde(with = "url_serde")]
638 pub uri: Url,
639
640 pub language_id: String,
642
643 pub version: u64,
646
647 pub text: String,
649}
650
651impl TextDocumentItem {
652 pub fn new(uri: Url, language_id: String, version: u64, text: String) -> TextDocumentItem {
653 TextDocumentItem {
654 uri: uri,
655 language_id: language_id,
656 version: version,
657 text: text,
658 }
659 }
660}
661
662#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
664pub struct VersionedTextDocumentIdentifier {
665 #[serde(with = "url_serde")]
668 pub uri: Url,
669
670 pub version: Option<u64>,
672}
673
674impl VersionedTextDocumentIdentifier {
675 pub fn new(uri: Url, version: u64) -> VersionedTextDocumentIdentifier {
676 VersionedTextDocumentIdentifier {
677 uri: uri,
678 version: Some(version),
679 }
680 }
681}
682
683#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
685#[serde(rename_all = "camelCase")]
686pub struct TextDocumentPositionParams {
687 pub text_document: TextDocumentIdentifier,
693
694 pub position: Position,
696}
697
698impl TextDocumentPositionParams {
699 pub fn new(
700 text_document: TextDocumentIdentifier,
701 position: Position,
702 ) -> TextDocumentPositionParams {
703 TextDocumentPositionParams {
704 text_document: text_document,
705 position: position,
706 }
707 }
708}
709
710#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
717pub struct DocumentFilter {
718 #[serde(skip_serializing_if = "Option::is_none")]
722 pub language: Option<String>,
723
724 #[serde(skip_serializing_if = "Option::is_none")]
728 pub scheme: Option<String>,
729
730 #[serde(skip_serializing_if = "Option::is_none")]
734 pub pattern: Option<String>,
735}
736
737pub type DocumentSelector = Vec<DocumentFilter>;
739
740#[derive(Debug, PartialEq, Deserialize, Serialize)]
743#[serde(rename_all = "camelCase")]
744pub struct InitializeParams {
745 pub process_id: Option<u64>,
749
750 #[serde(skip_serializing_if = "Option::is_none")]
753 pub root_path: Option<String>,
754
755 #[serde(with = "option_url")]
759 #[serde(default)]
760 pub root_uri: Option<Url>,
761
762 #[serde(skip_serializing_if = "Option::is_none")]
764 pub initialization_options: Option<Value>,
765
766 pub capabilities: ClientCapabilities,
768
769 #[serde(default)]
771 #[serde(skip_serializing_if = "Option::is_none")]
772 pub trace: Option<TraceOption>,
773
774 #[serde(skip_serializing_if = "Option::is_none")]
779 pub workspace_folders: Option<Vec<WorkspaceFolder>>,
780}
781
782#[derive(Debug, PartialEq, Deserialize, Serialize)]
783pub struct InitializedParams {}
784
785#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
786pub enum TraceOption {
787 #[serde(rename = "off")]
788 Off,
789 #[serde(rename = "messages")]
790 Messages,
791 #[serde(rename = "verbose")]
792 Verbose,
793}
794
795impl Default for TraceOption {
796 fn default() -> TraceOption {
797 TraceOption::Off
798 }
799}
800
801mod option_url {
802 use serde::{self, Serialize};
803 use url::Url;
804 use url_serde::{De, Ser};
805
806 pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<Url>, D::Error>
807 where
808 D: serde::Deserializer<'de>,
809 {
810 serde::Deserialize::deserialize(deserializer)
811 .map(|x: Option<De<Url>>| x.map(|url| url.into_inner()))
812 }
813
814 pub fn serialize<S>(self_: &Option<Url>, serializer: S) -> Result<S::Ok, S::Error>
815 where
816 S: serde::Serializer,
817 {
818 self_.as_ref().map(Ser::new).serialize(serializer)
819 }
820}
821
822#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
823#[serde(rename_all = "camelCase")]
824pub struct GenericCapability {
825 #[serde(skip_serializing_if = "Option::is_none")]
829 pub dynamic_registration: Option<bool>,
830}
831
832#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
833#[serde(rename_all = "camelCase")]
834pub struct GotoCapability {
835 #[serde(skip_serializing_if = "Option::is_none")]
836 pub dynamic_registration: Option<bool>,
837
838 pub link_support: Option<bool>,
840}
841
842#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
843#[serde(rename_all = "camelCase")]
844pub struct WorkspaceEditCapability {
845 #[serde(skip_serializing_if = "Option::is_none")]
849 pub document_changes: Option<bool>,
850
851 #[serde(skip_serializing_if = "Option::is_none")]
856 pub resource_operations: Option<Vec<ResourceOperationKind>>,
857
858 #[serde(skip_serializing_if = "Option::is_none")]
863 pub failure_handling: Option<FailureHandlingKind>,
864}
865
866#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
867#[serde(rename_all = "camelCase")]
868pub struct WorkspaceCapability {
869 #[serde(skip_serializing_if = "Option::is_none")]
871 pub workspace_folders: Option<WorkspaceFolderCapability>,
872}
873
874#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
875#[serde(rename_all = "camelCase")]
876pub struct WorkspaceFolderCapability {
877 #[serde(skip_serializing_if = "Option::is_none")]
878 pub supported: Option<bool>,
879
880 #[serde(skip_serializing_if = "Option::is_none")]
881 pub change_notifications: Option<WorkspaceFolderCapabilityChangeNotifications>,
882}
883
884#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
885#[serde(untagged)]
886pub enum WorkspaceFolderCapabilityChangeNotifications {
887 Bool(bool),
888 Id(String),
889}
890
891#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
892#[serde(rename_all = "camelCase")]
893pub struct WorkspaceFolder {
894 #[serde(with = "url_serde")]
896 pub uri: Url,
897 pub name: String,
899}
900
901#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
902#[serde(rename_all = "camelCase")]
903pub struct DidChangeWorkspaceFoldersParams {
904 pub event: WorkspaceFoldersChangeEvent,
908}
909
910#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
914#[serde(rename_all = "camelCase")]
915pub struct WorkspaceFoldersChangeEvent {
916 pub added: Vec<WorkspaceFolder>,
920
921 pub removed: Vec<WorkspaceFolder>,
925}
926
927#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Copy, Clone)]
928#[serde(rename_all = "lowercase")]
929pub enum ResourceOperationKind {
930 Create,
931 Rename,
932 Delete,
933}
934
935#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Copy, Clone)]
936#[serde(rename_all = "camelCase")]
937pub enum FailureHandlingKind {
938 Abort,
939 Transactional,
940 TextOnlyTransactional,
941 Undo,
942}
943
944#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
948#[serde(rename_all = "camelCase")]
949pub struct SymbolKindCapability {
950 pub value_set: Option<Vec<SymbolKind>>,
961}
962
963#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
964#[serde(rename_all = "camelCase")]
965pub struct SymbolCapability {
966 #[serde(skip_serializing_if = "Option::is_none")]
970 pub dynamic_registration: Option<bool>,
971
972 #[serde(skip_serializing_if = "Option::is_none")]
976 pub symbol_kind: Option<SymbolKindCapability>,
977}
978
979#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
983#[serde(rename_all = "camelCase")]
984pub struct WorkspaceClientCapabilities {
985 #[serde(skip_serializing_if = "Option::is_none")]
990 pub apply_edit: Option<bool>,
991
992 #[serde(skip_serializing_if = "Option::is_none")]
996 pub workspace_edit: Option<WorkspaceEditCapability>,
997
998 #[serde(skip_serializing_if = "Option::is_none")]
1002 pub did_change_configuration: Option<GenericCapability>,
1003
1004 #[serde(skip_serializing_if = "Option::is_none")]
1008 pub did_change_watched_files: Option<GenericCapability>,
1009
1010 #[serde(skip_serializing_if = "Option::is_none")]
1014 pub symbol: Option<SymbolCapability>,
1015
1016 #[serde(skip_serializing_if = "Option::is_none")]
1020 pub execute_command: Option<GenericCapability>,
1021
1022 #[serde(skip_serializing_if = "Option::is_none")]
1026 pub workspace_folders: Option<bool>,
1027
1028 #[serde(skip_serializing_if = "Option::is_none")]
1032 pub configuration: Option<bool>,
1033}
1034
1035#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
1036#[serde(rename_all = "camelCase")]
1037pub struct SynchronizationCapability {
1038 #[serde(skip_serializing_if = "Option::is_none")]
1042 pub dynamic_registration: Option<bool>,
1043
1044 #[serde(skip_serializing_if = "Option::is_none")]
1048 pub will_save: Option<bool>,
1049
1050 #[serde(skip_serializing_if = "Option::is_none")]
1056 pub will_save_wait_until: Option<bool>,
1057
1058 #[serde(skip_serializing_if = "Option::is_none")]
1062 pub did_save: Option<bool>,
1063}
1064
1065#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
1066#[serde(rename_all = "camelCase")]
1067pub struct CompletionItemCapability {
1068 #[serde(skip_serializing_if = "Option::is_none")]
1077 pub snippet_support: Option<bool>,
1078
1079 #[serde(skip_serializing_if = "Option::is_none")]
1083 pub commit_characters_support: Option<bool>,
1084
1085 #[serde(skip_serializing_if = "Option::is_none")]
1090 pub documentation_format: Option<Vec<MarkupKind>>,
1091
1092 #[serde(skip_serializing_if = "Option::is_none")]
1096 pub deprecated_support: Option<bool>,
1097
1098 #[serde(skip_serializing_if = "Option::is_none")]
1102 pub preselect_support: Option<bool>,
1103}
1104
1105#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
1106#[serde(rename_all = "camelCase")]
1107pub struct CompletionItemKindCapability {
1108 #[serde(skip_serializing_if = "Option::is_none")]
1119 pub value_set: Option<Vec<CompletionItemKind>>,
1120}
1121
1122#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
1123#[serde(rename_all = "camelCase")]
1124pub struct HoverCapability {
1125 #[serde(skip_serializing_if = "Option::is_none")]
1129 pub dynamic_registration: Option<bool>,
1130
1131 #[serde(skip_serializing_if = "Option::is_none")]
1136 pub content_format: Option<Vec<MarkupKind>>,
1137}
1138
1139#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
1140#[serde(rename_all = "camelCase")]
1141pub struct CompletionCapability {
1142 #[serde(skip_serializing_if = "Option::is_none")]
1146 pub dynamic_registration: Option<bool>,
1147
1148 #[serde(skip_serializing_if = "Option::is_none")]
1153 pub completion_item: Option<CompletionItemCapability>,
1154
1155 #[serde(skip_serializing_if = "Option::is_none")]
1156 pub completion_item_kind: Option<CompletionItemKindCapability>,
1157
1158 #[serde(skip_serializing_if = "Option::is_none")]
1163 pub context_support: Option<bool>,
1164}
1165
1166#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1167#[serde(rename_all = "camelCase")]
1168pub struct SignatureInformationSettings {
1169 #[serde(skip_serializing_if = "Option::is_none")]
1174 pub documentation_format: Option<Vec<MarkupKind>>,
1175
1176 #[serde(skip_serializing_if = "Option::is_none")]
1177 pub parameter_information: Option<ParameterInformationSettings>,
1178}
1179
1180#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1181#[serde(rename_all = "camelCase")]
1182pub struct ParameterInformationSettings {
1183 #[serde(skip_serializing_if = "Option::is_none")]
1188 pub label_offset_support: Option<bool>
1189}
1190
1191#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
1192#[serde(rename_all = "camelCase")]
1193pub struct SignatureHelpCapability {
1194 #[serde(skip_serializing_if = "Option::is_none")]
1198 pub dynamic_registration: Option<bool>,
1199
1200 #[serde(skip_serializing_if = "Option::is_none")]
1205 pub signature_information: Option<SignatureInformationSettings>,
1206}
1207
1208#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
1209#[serde(rename_all = "camelCase")]
1210pub struct PublishDiagnosticsCapability {
1211 #[serde(skip_serializing_if = "Option::is_none")]
1215 pub related_information: Option<bool>,
1216}
1217
1218#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
1222#[serde(rename_all = "camelCase")]
1223pub struct TextDocumentClientCapabilities {
1224 #[serde(skip_serializing_if = "Option::is_none")]
1225 pub synchronization: Option<SynchronizationCapability>,
1226 #[serde(skip_serializing_if = "Option::is_none")]
1230 pub completion: Option<CompletionCapability>,
1231
1232 #[serde(skip_serializing_if = "Option::is_none")]
1236 pub hover: Option<HoverCapability>,
1237
1238 #[serde(skip_serializing_if = "Option::is_none")]
1242 pub signature_help: Option<SignatureHelpCapability>,
1243
1244 #[serde(skip_serializing_if = "Option::is_none")]
1248 pub references: Option<GenericCapability>,
1249
1250 #[serde(skip_serializing_if = "Option::is_none")]
1254 pub document_highlight: Option<GenericCapability>,
1255
1256 #[serde(skip_serializing_if = "Option::is_none")]
1260 pub document_symbol: Option<DocumentSymbolCapability>,
1261 #[serde(skip_serializing_if = "Option::is_none")]
1265 pub formatting: Option<GenericCapability>,
1266
1267 #[serde(skip_serializing_if = "Option::is_none")]
1271 pub range_formatting: Option<GenericCapability>,
1272
1273 #[serde(skip_serializing_if = "Option::is_none")]
1277 pub on_type_formatting: Option<GenericCapability>,
1278
1279 #[serde(skip_serializing_if = "Option::is_none")]
1283 pub declaration: Option<GotoCapability>,
1284
1285 #[serde(skip_serializing_if = "Option::is_none")]
1289 pub definition: Option<GotoCapability>,
1290
1291 #[serde(skip_serializing_if = "Option::is_none")]
1295 pub type_definition: Option<GotoCapability>,
1296
1297 #[serde(skip_serializing_if = "Option::is_none")]
1301 pub implementation: Option<GotoCapability>,
1302
1303 #[serde(skip_serializing_if = "Option::is_none")]
1307 pub code_action: Option<CodeActionCapability>,
1308
1309 #[serde(skip_serializing_if = "Option::is_none")]
1313 pub code_lens: Option<GenericCapability>,
1314
1315 #[serde(skip_serializing_if = "Option::is_none")]
1319 pub document_link: Option<GenericCapability>,
1320
1321 pub color_provider: Option<GenericCapability>,
1326
1327 #[serde(skip_serializing_if = "Option::is_none")]
1331 pub rename: Option<RenameCapability>,
1332
1333 #[serde(skip_serializing_if = "Option::is_none")]
1337 pub publish_diagnostics: Option<PublishDiagnosticsCapability>,
1338
1339 #[serde(skip_serializing_if = "Option::is_none")]
1343 pub folding_range: Option<FoldingRangeCapability>,
1344}
1345
1346#[derive(Debug, PartialEq, Default, Deserialize, Serialize)]
1350#[serde(rename_all = "camelCase")]
1351pub struct ClientCapabilities {
1352 #[serde(skip_serializing_if = "Option::is_none")]
1356 pub workspace: Option<WorkspaceClientCapabilities>,
1357
1358 #[serde(skip_serializing_if = "Option::is_none")]
1362 pub text_document: Option<TextDocumentClientCapabilities>,
1363
1364 #[serde(skip_serializing_if = "Option::is_none")]
1368 pub experimental: Option<Value>,
1369}
1370
1371#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
1372pub struct InitializeResult {
1373 pub capabilities: ServerCapabilities,
1375}
1376
1377#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
1378pub struct InitializeError {
1379 pub retry: bool,
1383}
1384
1385#[derive(Debug, Eq, PartialEq, Clone, Copy)]
1389pub enum TextDocumentSyncKind {
1390 None = 0,
1392
1393 Full = 1,
1395
1396 Incremental = 2,
1399}
1400
1401impl<'de> serde::Deserialize<'de> for TextDocumentSyncKind {
1402 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1403 where
1404 D: serde::Deserializer<'de>,
1405 {
1406 Ok(match try!(u8::deserialize(deserializer)) {
1407 0 => TextDocumentSyncKind::None,
1408 1 => TextDocumentSyncKind::Full,
1409 2 => TextDocumentSyncKind::Incremental,
1410 i => {
1411 return Err(D::Error::invalid_value(
1412 de::Unexpected::Unsigned(i as u64),
1413 &"value between 0 and 2 (inclusive)",
1414 ));
1415 }
1416 })
1417 }
1418}
1419
1420impl serde::Serialize for TextDocumentSyncKind {
1421 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1422 where
1423 S: serde::Serializer,
1424 {
1425 serializer.serialize_u8(*self as u8)
1426 }
1427}
1428
1429#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
1431#[serde(rename_all = "camelCase")]
1432pub struct CompletionOptions {
1433 #[serde(skip_serializing_if = "Option::is_none")]
1435 pub resolve_provider: Option<bool>,
1436
1437 #[serde(skip_serializing_if = "Option::is_none")]
1439 pub trigger_characters: Option<Vec<String>>,
1440}
1441
1442#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
1444#[serde(rename_all = "camelCase")]
1445pub struct SignatureHelpOptions {
1446 #[serde(skip_serializing_if = "Option::is_none")]
1448 pub trigger_characters: Option<Vec<String>>,
1449}
1450
1451#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1453#[serde(rename_all = "camelCase")]
1454pub struct CodeLensOptions {
1455 #[serde(skip_serializing_if = "Option::is_none")]
1457 pub resolve_provider: Option<bool>,
1458}
1459
1460#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
1462#[serde(rename_all = "camelCase")]
1463pub struct DocumentOnTypeFormattingOptions {
1464 pub first_trigger_character: String,
1466
1467 #[serde(skip_serializing_if = "Option::is_none")]
1469 pub more_trigger_character: Option<Vec<String>>,
1470}
1471
1472#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
1474pub struct ExecuteCommandOptions {
1475 pub commands: Vec<String>,
1477}
1478
1479#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
1483#[serde(rename_all = "camelCase")]
1484pub struct SaveOptions {
1485 #[serde(skip_serializing_if = "Option::is_none")]
1489 pub include_text: Option<bool>,
1490}
1491
1492#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
1493#[serde(rename_all = "camelCase")]
1494pub struct TextDocumentSyncOptions {
1495 #[serde(skip_serializing_if = "Option::is_none")]
1499 pub open_close: Option<bool>,
1500
1501 #[serde(skip_serializing_if = "Option::is_none")]
1506 pub change: Option<TextDocumentSyncKind>,
1507
1508 #[serde(skip_serializing_if = "Option::is_none")]
1512 pub will_save: Option<bool>,
1513
1514 #[serde(skip_serializing_if = "Option::is_none")]
1518 pub will_save_wait_until: Option<bool>,
1519
1520 #[serde(skip_serializing_if = "Option::is_none")]
1524 pub save: Option<SaveOptions>,
1525}
1526
1527#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1528#[serde(untagged)]
1529pub enum TextDocumentSyncCapability {
1530 Kind(TextDocumentSyncKind),
1531 Options(TextDocumentSyncOptions),
1532}
1533
1534#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1535#[serde(untagged)]
1536pub enum ImplementationProviderCapability {
1537 Simple(bool),
1538 Options(StaticTextDocumentRegistrationOptions),
1539}
1540
1541#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1542#[serde(untagged)]
1543pub enum TypeDefinitionProviderCapability {
1544 Simple(bool),
1545 Options(StaticTextDocumentRegistrationOptions),
1546}
1547
1548#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1549#[serde(untagged)]
1550pub enum ColorProviderCapability {
1551 Simple(bool),
1552 ColorProvider(ColorProviderOptions),
1553 Options(StaticTextDocumentColorProviderOptions),
1554}
1555
1556#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1557#[serde(untagged)]
1558pub enum CodeActionProviderCapability {
1559 Simple(bool),
1560 Options(CodeActionOptions),
1561}
1562
1563#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
1564#[serde(rename_all = "camelCase")]
1565pub struct CodeActionCapability {
1566 #[serde(skip_serializing_if = "Option::is_none")]
1570 pub dynamic_registration: Option<bool>,
1571
1572 #[serde(skip_serializing_if = "Option::is_none")]
1575 pub code_action_literal_support: Option<CodeActionLiteralSupport>,
1576}
1577
1578#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
1579#[serde(rename_all = "camelCase")]
1580pub struct CodeActionLiteralSupport {
1581 pub code_action_kind: CodeActionKindLiteralSupport,
1583}
1584
1585#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
1586#[serde(rename_all = "camelCase")]
1587pub struct CodeActionKindLiteralSupport {
1588 pub value_set: Vec<String>,
1593}
1594
1595#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
1596#[serde(rename_all = "camelCase")]
1597pub struct ServerCapabilities {
1598 #[serde(skip_serializing_if = "Option::is_none")]
1600 pub text_document_sync: Option<TextDocumentSyncCapability>,
1601
1602 #[serde(skip_serializing_if = "Option::is_none")]
1604 pub hover_provider: Option<bool>,
1605
1606 #[serde(skip_serializing_if = "Option::is_none")]
1608 pub completion_provider: Option<CompletionOptions>,
1609
1610 #[serde(skip_serializing_if = "Option::is_none")]
1612 pub signature_help_provider: Option<SignatureHelpOptions>,
1613
1614 #[serde(skip_serializing_if = "Option::is_none")]
1616 pub definition_provider: Option<bool>,
1617
1618 #[serde(skip_serializing_if = "Option::is_none")]
1620 pub type_definition_provider: Option<TypeDefinitionProviderCapability>,
1621
1622 #[serde(skip_serializing_if = "Option::is_none")]
1624 pub implementation_provider: Option<ImplementationProviderCapability>,
1625
1626 #[serde(skip_serializing_if = "Option::is_none")]
1628 pub references_provider: Option<bool>,
1629
1630 #[serde(skip_serializing_if = "Option::is_none")]
1632 pub document_highlight_provider: Option<bool>,
1633
1634 #[serde(skip_serializing_if = "Option::is_none")]
1636 pub document_symbol_provider: Option<bool>,
1637
1638 #[serde(skip_serializing_if = "Option::is_none")]
1640 pub workspace_symbol_provider: Option<bool>,
1641
1642 #[serde(skip_serializing_if = "Option::is_none")]
1644 pub code_action_provider: Option<CodeActionProviderCapability>,
1645
1646 #[serde(skip_serializing_if = "Option::is_none")]
1648 pub code_lens_provider: Option<CodeLensOptions>,
1649
1650 #[serde(skip_serializing_if = "Option::is_none")]
1652 pub document_formatting_provider: Option<bool>,
1653
1654 #[serde(skip_serializing_if = "Option::is_none")]
1656 pub document_range_formatting_provider: Option<bool>,
1657
1658 #[serde(skip_serializing_if = "Option::is_none")]
1660 pub document_on_type_formatting_provider: Option<DocumentOnTypeFormattingOptions>,
1661
1662 #[serde(skip_serializing_if = "Option::is_none")]
1664 pub rename_provider: Option<RenameProviderCapability>,
1665
1666 #[serde(skip_serializing_if = "Option::is_none")]
1668 pub color_provider: Option<ColorProviderCapability>,
1669
1670 #[serde(skip_serializing_if = "Option::is_none")]
1672 pub folding_range_provider: Option<FoldingRangeProviderCapability>,
1673
1674 #[serde(skip_serializing_if = "Option::is_none")]
1676 pub execute_command_provider: Option<ExecuteCommandOptions>,
1677
1678 #[serde(skip_serializing_if = "Option::is_none")]
1680 pub workspace: Option<WorkspaceCapability>,
1681}
1682
1683#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1684pub struct ShowMessageParams {
1685 #[serde(rename = "type")]
1687 pub typ: MessageType,
1688
1689 pub message: String,
1691}
1692
1693#[derive(Debug, Eq, PartialEq, Clone, Copy)]
1694pub enum MessageType {
1695 Error = 1,
1697 Warning = 2,
1699 Info = 3,
1701 Log = 4,
1703}
1704
1705impl<'de> serde::Deserialize<'de> for MessageType {
1706 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1707 where
1708 D: serde::Deserializer<'de>,
1709 {
1710 Ok(match try!(u8::deserialize(deserializer)) {
1711 1 => MessageType::Error,
1712 2 => MessageType::Warning,
1713 3 => MessageType::Info,
1714 4 => MessageType::Log,
1715 i => {
1716 return Err(D::Error::invalid_value(
1717 de::Unexpected::Unsigned(i as u64),
1718 &"value of 1, 2, 3 or 4",
1719 ));
1720 }
1721 })
1722 }
1723}
1724
1725impl serde::Serialize for MessageType {
1726 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1727 where
1728 S: serde::Serializer,
1729 {
1730 serializer.serialize_u8(*self as u8)
1731 }
1732}
1733
1734#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1735pub struct ShowMessageRequestParams {
1736 #[serde(rename = "type")]
1738 pub typ: MessageType,
1739
1740 pub message: String,
1742
1743 #[serde(skip_serializing_if = "Option::is_none")]
1745 pub actions: Option<Vec<MessageActionItem>>,
1746}
1747
1748#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1749pub struct MessageActionItem {
1750 pub title: String,
1752}
1753
1754#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1755pub struct LogMessageParams {
1756 #[serde(rename = "type")]
1758 pub typ: MessageType,
1759
1760 pub message: String,
1762}
1763
1764#[derive(Debug, PartialEq, Deserialize, Serialize)]
1768#[serde(rename_all = "camelCase")]
1769pub struct Registration {
1770 pub id: String,
1775
1776 pub method: String,
1780
1781 #[serde(skip_serializing_if = "Option::is_none")]
1785 pub register_options: Option<Value>,
1786}
1787
1788#[derive(Debug, PartialEq, Deserialize, Serialize)]
1789pub struct RegistrationParams {
1790 pub registrations: Vec<Registration>,
1791}
1792
1793#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1796#[serde(rename_all = "camelCase")]
1797pub struct TextDocumentRegistrationOptions {
1798 pub document_selector: Option<DocumentSelector>,
1803}
1804
1805#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1806#[serde(rename_all = "camelCase")]
1807pub struct StaticRegistrationOptions {
1808 #[serde(skip_serializing_if = "Option::is_none")]
1809 pub id: Option<String>,
1810}
1811
1812#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1813#[serde(rename_all = "camelCase")]
1814pub struct StaticTextDocumentRegistrationOptions {
1815 pub document_selector: Option<DocumentSelector>,
1820
1821 #[serde(skip_serializing_if = "Option::is_none")]
1822 pub id: Option<String>,
1823}
1824
1825#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1826#[serde(rename_all = "camelCase")]
1827pub struct ColorProviderOptions {}
1828
1829#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1830#[serde(rename_all = "camelCase")]
1831pub struct StaticTextDocumentColorProviderOptions {
1832 pub document_selector: Option<DocumentSelector>,
1837
1838 #[serde(skip_serializing_if = "Option::is_none")]
1839 pub id: Option<String>,
1840}
1841
1842#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1846pub struct Unregistration {
1847 pub id: String,
1852
1853 pub method: String,
1857}
1858
1859#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1860pub struct UnregistrationParams {
1861 pub unregisterations: Vec<Unregistration>,
1862}
1863
1864#[derive(Debug, PartialEq, Deserialize, Serialize)]
1865pub struct DidChangeConfigurationParams {
1866 pub settings: Value,
1868}
1869
1870#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1871#[serde(rename_all = "camelCase")]
1872pub struct DidOpenTextDocumentParams {
1873 pub text_document: TextDocumentItem,
1875}
1876
1877#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1878#[serde(rename_all = "camelCase")]
1879pub struct DidChangeTextDocumentParams {
1880 pub text_document: VersionedTextDocumentIdentifier,
1884 pub content_changes: Vec<TextDocumentContentChangeEvent>,
1886}
1887
1888#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1891#[serde(rename_all = "camelCase")]
1892pub struct TextDocumentContentChangeEvent {
1893 #[serde(skip_serializing_if = "Option::is_none")]
1895 pub range: Option<Range>,
1896
1897 #[serde(skip_serializing_if = "Option::is_none")]
1900 pub range_length: Option<u64>,
1901
1902 pub text: String,
1904}
1905
1906#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1912#[serde(rename_all = "camelCase")]
1913pub struct TextDocumentChangeRegistrationOptions {
1914 pub document_selector: Option<DocumentSelector>,
1919
1920 pub sync_kind: i32,
1925}
1926
1927#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1931#[serde(rename_all = "camelCase")]
1932pub struct WillSaveTextDocumentParams {
1933 pub text_document: TextDocumentIdentifier,
1937
1938 pub reason: TextDocumentSaveReason,
1942}
1943
1944#[derive(Clone, Copy, Debug, Eq, PartialEq)]
1948pub enum TextDocumentSaveReason {
1949 Manual = 1,
1954
1955 AfterDelay = 2,
1959
1960 FocusOut = 3,
1964}
1965
1966impl<'de> serde::Deserialize<'de> for TextDocumentSaveReason {
1967 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1968 where
1969 D: serde::Deserializer<'de>,
1970 {
1971 Ok(match try!(u8::deserialize(deserializer)) {
1972 1 => TextDocumentSaveReason::Manual,
1973 2 => TextDocumentSaveReason::AfterDelay,
1974 3 => TextDocumentSaveReason::FocusOut,
1975 i => {
1976 return Err(D::Error::invalid_value(
1977 de::Unexpected::Unsigned(i as u64),
1978 &"value of 1, 2 or 3",
1979 ))
1980 }
1981 })
1982 }
1983}
1984
1985impl serde::Serialize for TextDocumentSaveReason {
1986 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1987 where
1988 S: serde::Serializer,
1989 {
1990 serializer.serialize_u8(*self as u8)
1991 }
1992}
1993
1994#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
1995#[serde(rename_all = "camelCase")]
1996pub struct DidCloseTextDocumentParams {
1997 pub text_document: TextDocumentIdentifier,
1999}
2000
2001#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2002#[serde(rename_all = "camelCase")]
2003pub struct DidSaveTextDocumentParams {
2004 pub text_document: TextDocumentIdentifier,
2006}
2007
2008#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2009pub struct DidChangeWatchedFilesParams {
2010 pub changes: Vec<FileEvent>,
2012}
2013
2014#[derive(Debug, Eq, PartialEq, Copy, Clone)]
2016pub enum FileChangeType {
2017 Created = 1,
2019
2020 Changed = 2,
2022
2023 Deleted = 3,
2025}
2026
2027impl<'de> serde::Deserialize<'de> for FileChangeType {
2028 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
2029 where
2030 D: serde::Deserializer<'de>,
2031 {
2032 Ok(match try!(u8::deserialize(deserializer)) {
2033 1 => FileChangeType::Created,
2034 2 => FileChangeType::Changed,
2035 3 => FileChangeType::Deleted,
2036 i => {
2037 return Err(D::Error::invalid_value(
2038 de::Unexpected::Unsigned(i as u64),
2039 &"value of 1, 2 or 3",
2040 ))
2041 }
2042 })
2043 }
2044}
2045
2046impl serde::Serialize for FileChangeType {
2047 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
2048 where
2049 S: serde::Serializer,
2050 {
2051 serializer.serialize_u8(*self as u8)
2052 }
2053}
2054
2055#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2057pub struct FileEvent {
2058 #[serde(with = "url_serde")]
2060 pub uri: Url,
2061
2062 #[serde(rename = "type")]
2064 pub typ: FileChangeType,
2065}
2066
2067impl FileEvent {
2068 pub fn new(uri: Url, typ: FileChangeType) -> FileEvent {
2069 FileEvent { uri: uri, typ: typ }
2070 }
2071}
2072
2073#[derive(Debug, Deserialize, Serialize)]
2075pub struct DidChangeWatchedFilesRegistrationOptions {
2076 pub watchers: Vec<FileSystemWatcher>,
2078}
2079
2080#[derive(Debug, Deserialize, Serialize)]
2081#[serde(rename_all = "camelCase")]
2082pub struct FileSystemWatcher {
2083 pub glob_pattern: String,
2085
2086 #[serde(skip_serializing_if = "Option::is_none")]
2089 pub kind: Option<WatchKind>,
2090}
2091
2092bitflags! {
2093pub struct WatchKind: u8 {
2094 const Create = 1;
2096 const Change = 2;
2098 const Delete = 4;
2100}
2101}
2102
2103impl<'de> serde::Deserialize<'de> for WatchKind {
2104 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
2105 where
2106 D: serde::Deserializer<'de>,
2107 {
2108 let i = try!(u8::deserialize(deserializer));
2109 WatchKind::from_bits(i).ok_or_else(|| {
2110 D::Error::invalid_value(de::Unexpected::Unsigned(i as u64), &"Unknown flag")
2111 })
2112 }
2113}
2114
2115impl serde::Serialize for WatchKind {
2116 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
2117 where
2118 S: serde::Serializer,
2119 {
2120 serializer.serialize_u8(self.bits())
2121 }
2122}
2123
2124#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2125pub struct PublishDiagnosticsParams {
2126 #[serde(with = "url_serde")]
2128 pub uri: Url,
2129
2130 pub diagnostics: Vec<Diagnostic>,
2132}
2133
2134impl PublishDiagnosticsParams {
2135 pub fn new(uri: Url, diagnostics: Vec<Diagnostic>) -> PublishDiagnosticsParams {
2136 PublishDiagnosticsParams {
2137 uri: uri,
2138 diagnostics: diagnostics,
2139 }
2140 }
2141}
2142
2143#[derive(Debug, PartialEq, Serialize, Deserialize)]
2144#[serde(untagged)]
2145pub enum CompletionResponse {
2146 Array(Vec<CompletionItem>),
2147 List(CompletionList),
2148}
2149
2150#[derive(Debug, PartialEq, Deserialize, Serialize)]
2151#[serde(rename_all = "camelCase")]
2152pub struct CompletionParams {
2153 pub text_document: TextDocumentIdentifier,
2156
2157 pub position: Position,
2160
2161 #[serde(skip_serializing_if = "Option::is_none")]
2163 pub context: Option<CompletionContext>,
2164}
2165
2166#[derive(Debug, PartialEq, Deserialize, Serialize)]
2167#[serde(rename_all = "camelCase")]
2168pub struct CompletionContext {
2169 pub trigger_kind: CompletionTriggerKind,
2173
2174 #[serde(skip_serializing_if = "Option::is_none")]
2179 pub trigger_character: Option<String>,
2180}
2181
2182#[derive(Debug, PartialEq, Clone, Copy, FromPrimitive)]
2184pub enum CompletionTriggerKind {
2185 Invoked = 1,
2186 TriggerCharacter = 2,
2187 TriggerForIncompleteCompletions = 3,
2188}
2189
2190impl<'de> serde::Deserialize<'de> for CompletionTriggerKind {
2191 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
2192 where
2193 D: serde::Deserializer<'de>,
2194 {
2195 let i = try!(u8::deserialize(deserializer));
2196 CompletionTriggerKind::from_u8(i).ok_or_else(|| {
2197 D::Error::invalid_value(
2198 de::Unexpected::Unsigned(i as u64),
2199 &"value between 1 and 3 (inclusive)",
2200 )
2201 })
2202 }
2203}
2204
2205impl serde::Serialize for CompletionTriggerKind {
2206 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
2207 where
2208 S: serde::Serializer,
2209 {
2210 serializer.serialize_u8(*self as u8)
2211 }
2212}
2213
2214#[derive(Debug, PartialEq, Default, Deserialize, Serialize)]
2217#[serde(rename_all = "camelCase")]
2218pub struct CompletionList {
2219 pub is_incomplete: bool,
2222
2223 pub items: Vec<CompletionItem>,
2225}
2226
2227#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
2228#[serde(untagged)]
2229pub enum Documentation {
2230 String(String),
2231 MarkupContent(MarkupContent),
2232}
2233
2234#[derive(Debug, PartialEq, Default, Deserialize, Serialize, Clone)]
2235#[serde(rename_all = "camelCase")]
2236pub struct CompletionItem {
2237 pub label: String,
2241
2242 #[serde(skip_serializing_if = "Option::is_none")]
2245 pub kind: Option<CompletionItemKind>,
2246
2247 #[serde(skip_serializing_if = "Option::is_none")]
2250 pub detail: Option<String>,
2251
2252 #[serde(skip_serializing_if = "Option::is_none")]
2254 pub documentation: Option<Documentation>,
2255
2256 #[serde(skip_serializing_if = "Option::is_none")]
2258 pub deprecated: Option<bool>,
2259
2260 #[serde(skip_serializing_if = "Option::is_none")]
2262 pub preselect: Option<bool>,
2263
2264 #[serde(skip_serializing_if = "Option::is_none")]
2267 pub sort_text: Option<String>,
2268
2269 #[serde(skip_serializing_if = "Option::is_none")]
2272 pub filter_text: Option<String>,
2273
2274 #[serde(skip_serializing_if = "Option::is_none")]
2277 pub insert_text: Option<String>,
2278
2279 #[serde(skip_serializing_if = "Option::is_none")]
2282 pub insert_text_format: Option<InsertTextFormat>,
2283
2284 #[serde(skip_serializing_if = "Option::is_none")]
2288 pub text_edit: Option<TextEdit>,
2289
2290 #[serde(skip_serializing_if = "Option::is_none")]
2294 pub additional_text_edits: Option<Vec<TextEdit>>,
2295
2296 #[serde(skip_serializing_if = "Option::is_none")]
2300 pub command: Option<Command>,
2301
2302 #[serde(skip_serializing_if = "Option::is_none")]
2305 pub data: Option<Value>,
2306}
2307
2308impl CompletionItem {
2309 pub fn new_simple(label: String, detail: String) -> CompletionItem {
2311 CompletionItem {
2312 label: label,
2313 detail: Some(detail),
2314 ..Self::default()
2315 }
2316 }
2317}
2318
2319#[derive(Debug, Eq, PartialEq, Clone, Copy, FromPrimitive)]
2321pub enum CompletionItemKind {
2322 Text = 1,
2323 Method = 2,
2324 Function = 3,
2325 Constructor = 4,
2326 Field = 5,
2327 Variable = 6,
2328 Class = 7,
2329 Interface = 8,
2330 Module = 9,
2331 Property = 10,
2332 Unit = 11,
2333 Value = 12,
2334 Enum = 13,
2335 Keyword = 14,
2336 Snippet = 15,
2337 Color = 16,
2338 File = 17,
2339 Reference = 18,
2340 Folder = 19,
2341 EnumMember = 20,
2342 Constant = 21,
2343 Struct = 22,
2344 Event = 23,
2345 Operator = 24,
2346 TypeParameter = 25,
2347}
2348
2349impl<'de> serde::Deserialize<'de> for CompletionItemKind {
2350 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
2351 where
2352 D: serde::Deserializer<'de>,
2353 {
2354 let i = try!(u8::deserialize(deserializer));
2355 CompletionItemKind::from_u8(i).ok_or_else(|| {
2356 D::Error::invalid_value(
2357 de::Unexpected::Unsigned(i as u64),
2358 &"value between 1 and 18 (inclusive)",
2359 )
2360 })
2361 }
2362}
2363
2364impl serde::Serialize for CompletionItemKind {
2365 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
2366 where
2367 S: serde::Serializer,
2368 {
2369 serializer.serialize_u8(*self as u8)
2370 }
2371}
2372
2373#[derive(Debug, Eq, PartialEq, Clone, Copy, FromPrimitive)]
2375pub enum InsertTextFormat {
2376 PlainText = 1,
2377 Snippet = 2,
2378}
2379
2380impl<'de> serde::Deserialize<'de> for InsertTextFormat {
2381 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
2382 where
2383 D: serde::Deserializer<'de>,
2384 {
2385 let i = try!(u8::deserialize(deserializer));
2386 InsertTextFormat::from_u8(i).ok_or_else(|| {
2387 D::Error::invalid_value(
2388 de::Unexpected::Unsigned(i as u64),
2389 &"value between 1 and 2 (inclusive)",
2390 )
2391 })
2392 }
2393}
2394
2395impl serde::Serialize for InsertTextFormat {
2396 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
2397 where
2398 S: serde::Serializer,
2399 {
2400 serializer.serialize_u8(*self as u8)
2401 }
2402}
2403
2404#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2406pub struct Hover {
2407 pub contents: HoverContents,
2409 #[serde(skip_serializing_if = "Option::is_none")]
2412 pub range: Option<Range>,
2413}
2414
2415#[derive(Debug, Eq, PartialEq, Clone, Serialize, Deserialize)]
2419#[serde(untagged)]
2420pub enum HoverContents {
2421 Scalar(MarkedString),
2422 Array(Vec<MarkedString>),
2423 Markup(MarkupContent),
2424}
2425
2426#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2437#[serde(untagged)]
2438pub enum MarkedString {
2439 String(String),
2440 LanguageString(LanguageString),
2441}
2442
2443#[derive(Debug, Eq, PartialEq, Clone, Deserialize, Serialize)]
2444pub struct LanguageString {
2445 pub language: String,
2446 pub value: String,
2447}
2448
2449impl MarkedString {
2450 pub fn from_markdown(markdown: String) -> MarkedString {
2451 MarkedString::String(markdown)
2452 }
2453
2454 pub fn from_language_code(language: String, code_block: String) -> MarkedString {
2455 MarkedString::LanguageString(LanguageString {
2456 language: language,
2457 value: code_block,
2458 })
2459 }
2460}
2461
2462#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2466#[serde(rename_all = "camelCase")]
2467pub struct SignatureHelp {
2468 pub signatures: Vec<SignatureInformation>,
2470
2471 #[serde(skip_serializing_if = "Option::is_none")]
2473 pub active_signature: Option<u64>,
2474
2475 #[serde(skip_serializing_if = "Option::is_none")]
2477 pub active_parameter: Option<u64>,
2478}
2479
2480#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2484pub struct SignatureInformation {
2485 pub label: String,
2488
2489 #[serde(skip_serializing_if = "Option::is_none")]
2492 pub documentation: Option<Documentation>,
2493
2494 #[serde(skip_serializing_if = "Option::is_none")]
2496 pub parameters: Option<Vec<ParameterInformation>>,
2497}
2498
2499#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2502pub struct ParameterInformation {
2503 pub label: ParameterLabel,
2509
2510 #[serde(skip_serializing_if = "Option::is_none")]
2513 pub documentation: Option<Documentation>,
2514}
2515
2516#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2517#[serde(untagged)]
2518pub enum ParameterLabel {
2519 Simple(String),
2520 LabelOffsets([u64; 2]),
2521}
2522
2523#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2524#[serde(rename_all = "camelCase")]
2525pub struct ReferenceParams {
2526 pub text_document: TextDocumentIdentifier,
2529
2530 pub position: Position,
2533
2534 pub context: ReferenceContext,
2536}
2537
2538#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2539#[serde(rename_all = "camelCase")]
2540pub struct ReferenceContext {
2541 pub include_declaration: bool,
2543}
2544
2545#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2549pub struct DocumentHighlight {
2550 pub range: Range,
2552
2553 #[serde(skip_serializing_if = "Option::is_none")]
2555 pub kind: Option<DocumentHighlightKind>,
2556}
2557
2558#[derive(Debug, Eq, PartialEq, Copy, Clone)]
2560pub enum DocumentHighlightKind {
2561 Text = 1,
2563
2564 Read = 2,
2566
2567 Write = 3,
2569}
2570
2571impl<'de> serde::Deserialize<'de> for DocumentHighlightKind {
2572 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
2573 where
2574 D: serde::Deserializer<'de>,
2575 {
2576 Ok(match try!(u8::deserialize(deserializer)) {
2577 1 => DocumentHighlightKind::Text,
2578 2 => DocumentHighlightKind::Read,
2579 3 => DocumentHighlightKind::Write,
2580 i => {
2581 return Err(D::Error::invalid_value(
2582 de::Unexpected::Unsigned(i as u64),
2583 &"1, 2, or 3",
2584 ))
2585 }
2586 })
2587 }
2588}
2589
2590impl serde::Serialize for DocumentHighlightKind {
2591 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
2592 where
2593 S: serde::Serializer,
2594 {
2595 serializer.serialize_u8(*self as u8)
2596 }
2597}
2598
2599#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
2600#[serde(rename_all = "camelCase")]
2601pub struct DocumentSymbolCapability {
2602 #[serde(skip_serializing_if = "Option::is_none")]
2604 pub dynamic_registration: Option<bool>,
2605
2606 #[serde(skip_serializing_if = "Option::is_none")]
2608 pub symbol_kind: Option<SymbolKindCapability>,
2609
2610 #[serde(skip_serializing_if = "Option::is_none")]
2612 pub hierarchical_document_symbol_support: Option<bool>,
2613}
2614
2615#[derive(Debug, PartialEq, Serialize, Deserialize)]
2616#[serde(untagged)]
2617pub enum DocumentSymbolResponse {
2618 Flat(Vec<SymbolInformation>),
2619 Nested(Vec<DocumentSymbol>),
2620}
2621
2622#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2623#[serde(rename_all = "camelCase")]
2624pub struct DocumentSymbolParams {
2625 pub text_document: TextDocumentIdentifier,
2627}
2628
2629#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2634#[serde(rename_all = "camelCase")]
2635pub struct DocumentSymbol {
2636 pub name: String,
2638 #[serde(skip_serializing_if = "Option::is_none")]
2641 pub detail: Option<String>,
2642 pub kind: SymbolKind,
2644 #[serde(skip_serializing_if = "Option::is_none")]
2646 pub deprecated: Option<bool>,
2647 pub range: Range,
2651 pub selection_range: Range,
2654 #[serde(skip_serializing_if = "Option::is_none")]
2656 pub children: Option<Vec<DocumentSymbol>>,
2657}
2658
2659#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2662#[serde(rename_all = "camelCase")]
2663pub struct SymbolInformation {
2664 pub name: String,
2666
2667 pub kind: SymbolKind,
2669
2670 #[serde(skip_serializing_if = "Option::is_none")]
2672 pub deprecated: Option<bool>,
2673
2674 pub location: Location,
2676
2677 #[serde(skip_serializing_if = "Option::is_none")]
2679 pub container_name: Option<String>,
2680}
2681
2682#[derive(Debug, Eq, PartialEq, Copy, Clone, FromPrimitive)]
2684pub enum SymbolKind {
2685 File = 1,
2686 Module = 2,
2687 Namespace = 3,
2688 Package = 4,
2689 Class = 5,
2690 Method = 6,
2691 Property = 7,
2692 Field = 8,
2693 Constructor = 9,
2694 Enum = 10,
2695 Interface = 11,
2696 Function = 12,
2697 Variable = 13,
2698 Constant = 14,
2699 String = 15,
2700 Number = 16,
2701 Boolean = 17,
2702 Array = 18,
2703 Object = 19,
2704 Key = 20,
2705 Null = 21,
2706 EnumMember = 22,
2707 Struct = 23,
2708 Event = 24,
2709 Operator = 25,
2710 TypeParameter = 26,
2711
2712 Unknown = 255,
2714}
2715
2716impl<'de> serde::Deserialize<'de> for SymbolKind {
2717 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
2718 where
2719 D: serde::Deserializer<'de>,
2720 {
2721 let i = try!(u8::deserialize(deserializer));
2722 Ok(SymbolKind::from_u8(i).unwrap_or(SymbolKind::Unknown))
2723 }
2724}
2725
2726impl serde::Serialize for SymbolKind {
2727 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
2728 where
2729 S: serde::Serializer,
2730 {
2731 serializer.serialize_u8(*self as u8)
2732 }
2733}
2734
2735#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2737pub struct WorkspaceSymbolParams {
2738 pub query: String,
2740}
2741
2742#[derive(Debug, PartialEq, Deserialize, Serialize)]
2743pub struct ExecuteCommandParams {
2744 pub command: String,
2748 #[serde(default)]
2752 pub arguments: Vec<Value>,
2753}
2754
2755#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2759pub struct ExecuteCommandRegistrationOptions {
2760 pub commands: Vec<String>,
2764}
2765
2766#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2767pub struct ApplyWorkspaceEditParams {
2768 pub edit: WorkspaceEdit,
2772}
2773
2774#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2775pub struct ApplyWorkspaceEditResponse {
2776 pub applied: bool,
2780}
2781
2782#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2784#[serde(rename_all = "camelCase")]
2785pub struct CodeActionParams {
2786 pub text_document: TextDocumentIdentifier,
2788
2789 pub range: Range,
2791
2792 pub context: CodeActionContext,
2794}
2795
2796#[derive(Debug, Deserialize, Serialize)]
2798#[serde(untagged)]
2799pub enum CodeActionResponse {
2800 Commands(Vec<Command>),
2801 Actions(Vec<CodeAction>),
2802}
2803
2804pub mod code_action_kind {
2808
2809 pub const QUICKFIX: &'static str = "quickfix";
2813
2814 pub const REFACTOR: &'static str = "refactor";
2818
2819 pub const REFACTOR_EXTRACT: &'static str = "refactor.extract";
2831
2832 pub const REFACTOR_INLINE: &'static str = "refactor.inline";
2843
2844 pub const REFACTOR_REWRITE: &'static str = "refactor.rewrite";
2857
2858 pub const SOURCE: &'static str = "source";
2864
2865 pub const SOURCE_ORGANIZE_IMPORTS: &'static str = "source.organizeImports";
2869}
2870
2871#[derive(Debug, PartialEq, Deserialize, Serialize)]
2872pub struct CodeAction {
2873 pub title: String,
2875
2876 #[serde(skip_serializing_if = "Option::is_none")]
2879 pub kind: Option<String>,
2880
2881 #[serde(skip_serializing_if = "Option::is_none")]
2883 pub diagnostics: Option<Vec<Diagnostic>>,
2884
2885 #[serde(skip_serializing_if = "Option::is_none")]
2887 pub edit: Option<WorkspaceEdit>,
2888
2889 #[serde(skip_serializing_if = "Option::is_none")]
2893 pub command: Option<Command>,
2894}
2895
2896#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2899pub struct CodeActionContext {
2900 pub diagnostics: Vec<Diagnostic>,
2902
2903 #[serde(skip_serializing_if = "Option::is_none")]
2908 pub only: Option<Vec<String>>,
2909}
2910
2911#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2912#[serde(rename_all = "camelCase")]
2913pub struct CodeActionOptions {
2914 #[serde(skip_serializing_if = "Option::is_none")]
2921 pub code_action_kinds: Option<Vec<String>>,
2922}
2923
2924#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2925#[serde(rename_all = "camelCase")]
2926pub struct CodeLensParams {
2927 pub text_document: TextDocumentIdentifier,
2929}
2930
2931#[derive(Debug, PartialEq, Deserialize, Serialize)]
2937pub struct CodeLens {
2938 pub range: Range,
2940
2941 #[serde(skip_serializing_if = "Option::is_none")]
2943 pub command: Option<Command>,
2944
2945 #[serde(skip_serializing_if = "Option::is_none")]
2948 pub data: Option<Value>,
2949}
2950
2951#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2952#[serde(rename_all = "camelCase")]
2953pub struct DocumentLinkParams {
2954 pub text_document: TextDocumentIdentifier,
2958}
2959
2960#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
2965pub struct DocumentLink {
2966 pub range: Range,
2970 #[serde(with = "url_serde")]
2974 pub target: Url,
2975}
2976
2977#[derive(Debug, PartialEq, Deserialize, Serialize)]
2978#[serde(rename_all = "camelCase")]
2979pub struct DocumentFormattingParams {
2980 pub text_document: TextDocumentIdentifier,
2982
2983 pub options: FormattingOptions,
2985}
2986
2987#[derive(Debug, PartialEq, Serialize, Deserialize)]
2989#[serde(rename_all = "camelCase")]
2990pub struct FormattingOptions {
2991 pub tab_size: u64,
2993
2994 pub insert_spaces: bool,
2996
2997 #[serde(flatten)]
2999 pub properties: HashMap<String, FormattingProperty>,
3000}
3001
3002#[derive(Debug, PartialEq, Deserialize, Serialize)]
3003#[serde(untagged)]
3004pub enum FormattingProperty {
3005 Bool(bool),
3006 Number(f64),
3007 String(String),
3008}
3009
3010#[derive(Debug, PartialEq, Deserialize, Serialize)]
3011#[serde(rename_all = "camelCase")]
3012pub struct DocumentRangeFormattingParams {
3013 pub text_document: TextDocumentIdentifier,
3015
3016 pub range: Range,
3018
3019 pub options: FormattingOptions,
3021}
3022
3023#[derive(Debug, PartialEq, Deserialize, Serialize)]
3024#[serde(rename_all = "camelCase")]
3025pub struct DocumentOnTypeFormattingParams {
3026 pub text_document: TextDocumentIdentifier,
3028
3029 pub position: Position,
3031
3032 pub ch: String,
3034
3035 pub options: FormattingOptions,
3037}
3038
3039#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
3041#[serde(rename_all = "camelCase")]
3042pub struct DocumentOnTypeFormattingRegistrationOptions {
3043 pub document_selector: Option<DocumentSelector>,
3048
3049 pub first_trigger_character: String,
3053
3054 #[serde(skip_serializing_if = "Option::is_none")]
3058 pub more_trigger_character: Option<Vec<String>>,
3059}
3060
3061#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
3062#[serde(rename_all = "camelCase")]
3063pub struct RenameParams {
3064 pub text_document: TextDocumentIdentifier,
3066
3067 pub position: Position,
3069
3070 pub new_name: String,
3074}
3075
3076#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
3077#[serde(untagged)]
3078pub enum RenameProviderCapability {
3079 Simple(bool),
3080 Options(RenameOptions),
3081}
3082
3083#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
3084#[serde(rename_all = "camelCase")]
3085pub struct RenameOptions {
3086 #[serde(skip_serializing_if = "Option::is_none")]
3088 pub prepare_provider: Option<bool>,
3089}
3090
3091#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
3092#[serde(rename_all = "camelCase")]
3093pub struct RenameCapability {
3094 #[serde(skip_serializing_if = "Option::is_none")]
3096 pub dynamic_registration: Option<bool>,
3097
3098 #[serde(skip_serializing_if = "Option::is_none")]
3100 pub prepare_support: Option<bool>,
3101}
3102
3103#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
3104#[serde(untagged)]
3105pub enum PrepareRenameResponse {
3106 Range(Range),
3107 RangeWithPlaceholder { range: Range, placeholder: String },
3108}
3109
3110#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
3111#[serde(rename_all = "camelCase")]
3112pub struct DocumentColorParams {
3113 pub text_document: TextDocumentIdentifier,
3115}
3116
3117#[derive(Debug, PartialEq, Deserialize, Serialize)]
3118#[serde(rename_all = "camelCase")]
3119pub struct ColorInformation {
3120 pub range: Range,
3124 pub color: Color,
3128}
3129
3130#[derive(Debug, PartialEq, Deserialize, Serialize)]
3131#[serde(rename_all = "camelCase")]
3132pub struct Color {
3133 pub red: f64,
3137 pub green: f64,
3141 pub blue: f64,
3145 pub alpha: f64,
3149}
3150
3151#[derive(Debug, PartialEq, Deserialize, Serialize)]
3152#[serde(rename_all = "camelCase")]
3153pub struct ColorPresentationParams {
3154 pub text_document: TextDocumentIdentifier,
3158
3159 pub color: Color,
3163
3164 pub range: Range,
3168}
3169
3170#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, Default, Clone)]
3171#[serde(rename_all = "camelCase")]
3172pub struct ColorPresentation {
3173 pub label: String,
3179
3180 #[serde(skip_serializing_if = "Option::is_none")]
3186 pub text_edit: Option<TextEdit>,
3187
3188 #[serde(skip_serializing_if = "Option::is_none")]
3193 pub additional_text_edits: Option<Vec<TextEdit>>,
3194}
3195
3196#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
3197#[serde(rename_all = "camelCase")]
3198pub struct FoldingRangeParams {
3199 pub text_document: TextDocumentIdentifier,
3201}
3202
3203#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
3204#[serde(untagged)]
3205pub enum FoldingRangeProviderCapability {
3206 Simple(bool),
3207 FoldingProvider(FoldingProviderOptions),
3208 Options(StaticTextDocumentColorProviderOptions),
3209}
3210
3211#[derive(Debug, Eq, PartialEq, Deserialize, Serialize)]
3212pub struct FoldingProviderOptions {}
3213
3214#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
3215#[serde(rename_all = "camelCase")]
3216pub struct FoldingRangeCapability {
3217 #[serde(skip_serializing_if = "Option::is_none")]
3223 pub dynamic_registration: Option<bool>,
3224
3225 #[serde(skip_serializing_if = "Option::is_none")]
3230 pub range_limit: Option<u64>,
3231 #[serde(skip_serializing_if = "Option::is_none")]
3236 pub line_folding_only: Option<bool>,
3237}
3238
3239#[derive(Debug, Eq, PartialEq, Default, Deserialize, Serialize)]
3243#[serde(rename_all = "camelCase")]
3244pub struct FoldingRange {
3245 pub start_line: u64,
3249
3250 #[serde(skip_serializing_if = "Option::is_none")]
3254 pub start_character: Option<u64>,
3255
3256 pub end_line: u64,
3260
3261 #[serde(skip_serializing_if = "Option::is_none")]
3265 pub end_character: Option<u64>,
3266
3267 #[serde(skip_serializing_if = "Option::is_none")]
3273 pub kind: Option<FoldingRangeKind>,
3274}
3275
3276#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
3280#[serde(rename_all = "lowercase")]
3281pub enum FoldingRangeKind {
3282 Comment,
3284 Imports,
3286 Region,
3288}
3289
3290#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
3298#[serde(rename_all = "lowercase")]
3299pub enum MarkupKind {
3300 PlainText,
3302 Markdown,
3304}
3305
3306#[derive(Debug, Eq, PartialEq, Deserialize, Serialize, Clone)]
3331pub struct MarkupContent {
3332 pub kind: MarkupKind,
3333 pub value: String,
3334}
3335
3336#[cfg(test)]
3337mod tests {
3338 use super::*;
3339 use serde::{Deserialize, Serialize};
3340
3341 fn test_serialization<SER>(ms: &SER, expected: &str)
3342 where
3343 SER: Serialize + for<'de> Deserialize<'de> + PartialEq + std::fmt::Debug,
3344 {
3345 let json_str = serde_json::to_string(ms).unwrap();
3346 assert_eq!(&json_str, expected);
3347 let deserialized: SER = serde_json::from_str(&json_str).unwrap();
3348 assert_eq!(&deserialized, ms);
3349 }
3350
3351 #[test]
3352 fn number_or_string() {
3353 test_serialization(&NumberOrString::Number(123), r#"123"#);
3354
3355 test_serialization(&NumberOrString::String("abcd".into()), r#""abcd""#);
3356 }
3357
3358 #[test]
3359 fn marked_string() {
3360 test_serialization(&MarkedString::from_markdown("xxx".into()), r#""xxx""#);
3361
3362 test_serialization(
3363 &MarkedString::from_language_code("lang".into(), "code".into()),
3364 r#"{"language":"lang","value":"code"}"#,
3365 );
3366 }
3367
3368 #[test]
3369 fn language_string() {
3370 test_serialization(
3371 &LanguageString {
3372 language: "LL".into(),
3373 value: "VV".into(),
3374 },
3375 r#"{"language":"LL","value":"VV"}"#,
3376 );
3377 }
3378
3379 #[test]
3380 fn workspace_edit() {
3381 test_serialization(
3382 &WorkspaceEdit {
3383 changes: Some(vec![].into_iter().collect()),
3384 document_changes: None,
3385 },
3386 r#"{"changes":{}}"#,
3387 );
3388
3389 test_serialization(
3390 &WorkspaceEdit {
3391 changes: None,
3392 document_changes: None,
3393 },
3394 r#"{}"#,
3395 );
3396
3397 test_serialization(&WorkspaceEdit {
3398 changes: Some(vec![(Url::parse("file://test").unwrap(), vec![])]
3399 .into_iter()
3400 .collect()),
3401 document_changes: None,
3402 },
3403 r#"{"changes":{"file://test/":[]}}"#);
3404 }
3405
3406 #[test]
3407 fn formatting_options() {
3408 test_serialization(
3409 &FormattingOptions {
3410 tab_size: 123,
3411 insert_spaces: true,
3412 properties: HashMap::new(),
3413 },
3414 r#"{"tabSize":123,"insertSpaces":true}"#,
3415 );
3416
3417 test_serialization(
3418 &FormattingOptions {
3419 tab_size: 123,
3420 insert_spaces: true,
3421 properties: vec![("prop".to_string(), FormattingProperty::Number(1.0))]
3422 .into_iter()
3423 .collect(),
3424 },
3425 r#"{"tabSize":123,"insertSpaces":true,"prop":1.0}"#,
3426 );
3427 }
3428
3429 #[test]
3430 fn root_uri_can_be_missing() {
3431 serde_json::from_str::<InitializeParams>(r#"{ "capabilities": {} }"#).unwrap();
3432 }
3433
3434 #[test]
3435 fn test_watch_kind() {
3436 test_serialization(&WatchKind::Create, "1");
3437 test_serialization(&(WatchKind::Create | WatchKind::Change), "3");
3438 test_serialization(
3439 &(WatchKind::Create | WatchKind::Change | WatchKind::Delete),
3440 "7",
3441 );
3442 }
3443
3444 #[test]
3445 fn test_resource_operation_kind() {
3446 test_serialization(
3447 &vec![ResourceOperationKind::Create, ResourceOperationKind::Rename, ResourceOperationKind::Delete],
3448 r#"["create","rename","delete"]"#);
3449 }
3450}