#![feature(proc_macro)]
#[macro_use]
extern crate enum_primitive;
extern crate serde;
extern crate serde_json;
#[macro_use]
extern crate serde_derive;
use std::collections::HashMap;
use serde::de::Error;
use serde_json::Value;
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct CancelParams {
pub id: String,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DidChangeTextDocumentParams {
#[serde(rename="textDocument")]
pub text_document: VersionedTextDocumentIdentifier,
#[serde(rename="contentChanges")]
pub content_changes: Vec<TextDocumentContentChangeEvent>,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct TextDocumentIdentifier {
pub uri: String,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct VersionedTextDocumentIdentifier {
pub uri: String,
pub version: u64,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct TextDocumentItem {
pub uri: String,
#[serde(rename="languageId")]
pub language_id: String,
pub version: u64,
pub text: String,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DidOpenTextDocumentParams {
#[serde(rename="textDocument")]
pub text_document: TextDocumentItem,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct TextDocumentContentChangeEvent {
pub range: Option<Range>,
#[serde(rename="rangeLength")]
pub range_length: Option<u64>,
pub text: String,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DidCloseTextDocumentParams {
#[serde(rename="textDocument")]
pub text_document: TextDocumentIdentifier,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DidSaveTextDocumentParams {
#[serde(rename="textDocument")]
pub text_document: TextDocumentIdentifier,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DidChangeWatchedFilesParams {
pub changes: Vec<FileEvent>,
}
#[derive(Debug, PartialEq, Copy, Clone)]
pub enum FileChangeType {
Created = 1,
Changed = 2,
Deleted = 3,
}
impl serde::Deserialize for FileChangeType {
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
where D: serde::Deserializer
{
Ok(match try!(u8::deserialize(deserializer)) {
1 => FileChangeType::Created,
2 => FileChangeType::Changed,
3 => FileChangeType::Deleted,
_ => {
return Err(D::Error::invalid_value("Expected a value of 1, 2 or 3 to deserialze \
to FileChangeType"))
}
})
}
}
impl serde::Serialize for FileChangeType {
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
where S: serde::Serializer
{
serializer.serialize_u8(*self as u8)
}
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct FileEvent {
pub uri: String,
pub typ: FileChangeType,
}
#[derive(Debug, PartialEq, Copy, Clone, Default, Deserialize, Serialize)]
pub struct Position {
pub line: u64,
pub character: u64,
}
#[derive(Debug, PartialEq, Copy, Clone, Default, Deserialize, Serialize)]
pub struct Range {
pub start: Position,
pub end: Position,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct Location {
pub uri: String,
pub range: Range,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct TextDocumentPositionParams {
#[serde(rename="textDocument")]
pub text_document: TextDocumentIdentifier,
pub position: Position,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct InitializeParams {
#[serde(rename="processId")]
pub process_id: u64,
#[serde(rename="rootPath")]
pub root_path: Option<String>,
pub capabilities: ClientCapabilities,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct ClientCapabilities {
_dummy: Option<()>,
}
#[derive(Debug, PartialEq, Default, Deserialize, Serialize)]
pub struct InitializeResult {
pub capabilities: ServerCapabilities,
}
#[derive(Debug, PartialEq, Default, Deserialize, Serialize)]
pub struct InitializeError {
pub retry: bool,
}
#[derive(Debug, PartialEq, Default, Deserialize, Serialize)]
pub struct ServerCapabilities {
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="textDocumentSync")]
pub text_document_sync: Option<TextDocumentSyncKind>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="hoverProvider")]
pub hover_provider: Option<bool>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="completionProvider")]
pub completion_provider: Option<CompletionOptions>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="signatureHelpProvider")]
pub signature_help_provider: Option<SignatureHelpOptions>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="definitionProvider")]
pub definition_provider: Option<bool>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="referencesProvider")]
pub references_provider: Option<bool>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="documentHighlightProvider")]
pub document_highlight_provider: Option<bool>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="documentSymbolProvider")]
pub document_symbol_provider: Option<bool>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="workspaceSymbolProvider")]
pub workspace_symbol_provider: Option<bool>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="codeActionProvider")]
pub code_action_provider: Option<bool>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="codeLensProvider")]
pub code_lens_provider: Option<CodeLensOptions>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="documentFormattingProvider")]
pub document_formatting_provider: Option<bool>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="documentRangeFormattingProvider")]
pub document_range_formatting_provider: Option<bool>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="documentOnTypeFormattingProvider")]
pub document_on_type_formatting_provider: Option<DocumentOnTypeFormattingOptions>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="renameProvider")]
pub rename_provider: Option<bool>,
}
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum TextDocumentSyncKind {
None = 0,
Full = 1,
Incremental = 2,
}
impl serde::Deserialize for TextDocumentSyncKind {
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
where D: serde::Deserializer
{
Ok(match try!(u8::deserialize(deserializer)) {
0 => TextDocumentSyncKind::None,
1 => TextDocumentSyncKind::Full,
2 => TextDocumentSyncKind::Incremental,
_ => {
return Err(D::Error::invalid_value("Expected a value between 1 and 2 (inclusive) \
to deserialize to TextDocumentSyncKind"))
}
})
}
}
impl serde::Serialize for TextDocumentSyncKind {
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
where S: serde::Serializer
{
serializer.serialize_u8(*self as u8)
}
}
#[derive(Debug, PartialEq, Default, Deserialize, Serialize)]
pub struct CompletionOptions {
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="resolveProvider")]
pub resolve_provider: Option<bool>,
#[serde(rename="triggerCharacters")]
pub trigger_characters: Vec<String>,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct SignatureHelpOptions {
#[serde(skip_serializing_if="Vec::is_empty")]
#[serde(rename="triggerCharacters")]
pub trigger_characters: Vec<String>,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct CodeLensOptions {
#[serde(rename="resolveProvider")]
pub resolve_provider: Option<bool>,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DocumentOnTypeFormattingOptions {
#[serde(rename="firstTriggerCharacter")]
pub first_trigger_character: String,
#[serde(skip_serializing_if="Vec::is_empty")]
#[serde(rename="moreTriggerCharacter")]
pub more_trigger_character: Vec<String>,
}
#[derive(Debug, PartialEq, Default, Deserialize, Serialize)]
pub struct TextEdit {
pub range: Range,
#[serde(rename="newText")]
pub new_text: String,
}
#[derive(Debug, PartialEq, Default, Deserialize, Serialize)]
pub struct WorkspaceEdit {
pub changes: HashMap<String, Vec<TextEdit>>,
}
#[derive(Debug, PartialEq, Default, Deserialize, Serialize)]
pub struct CompletionList {
#[serde(rename="isIncomplete")]
pub is_incomplete: bool,
pub items: Vec<CompletionItem>,
}
#[derive(Debug, PartialEq, Default, Deserialize, Serialize)]
pub struct CompletionItem {
pub label: String,
#[serde(skip_serializing_if="Option::is_none")]
pub kind: Option<CompletionItemKind>,
#[serde(skip_serializing_if="Option::is_none")]
pub detail: Option<String>,
#[serde(skip_serializing_if="Option::is_none")]
pub documentation: Option<String>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="sortText")]
pub sort_text: Option<String>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="filterText")]
pub filter_text: Option<String>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="insertText")]
pub insert_text: Option<String>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="textEdit")]
pub text_edit: Option<TextEdit>,
#[serde(skip_serializing_if="Option::is_none")]
pub data: Option<Value>,
}
enum_from_primitive!{
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum CompletionItemKind {
Text = 1,
Method = 2,
Function = 3,
Constructor = 4,
Field = 5,
Variable = 6,
Class = 7,
Interface = 8,
Module = 9,
Property = 10,
Unit = 11,
Value = 12,
Enum = 13,
Keyword = 14,
Snippet = 15,
Color = 16,
File = 17,
Reference = 18,
}
}
impl serde::Deserialize for CompletionItemKind {
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
where D: serde::Deserializer
{
use enum_primitive::FromPrimitive;
let i = try!(u8::deserialize(deserializer));
CompletionItemKind::from_u8(i).ok_or_else(|| {
D::Error::invalid_value("Expected a value between 1 and 18 (inclusive) to deserialize \
to CompletionItemKind")
})
}
}
impl serde::Serialize for CompletionItemKind {
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
where S: serde::Serializer
{
serializer.serialize_u8(*self as u8)
}
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct Hover {
pub contents: Vec<MarkedString>,
pub range: Option<Range>,
}
#[derive(Debug, PartialEq)]
pub enum MarkedString {
String(String),
LanguageString { language: String, value: String },
}
impl serde::Deserialize for MarkedString {
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
where D: serde::Deserializer
{
String::deserialize(deserializer)
.map(MarkedString::String)
.or_else(|_| {
use std::borrow::Cow;
#[derive(Deserialize, Serialize)]
struct Variant<'s> {
language: Cow<'s, str>,
value: Cow<'s, str>,
}
Variant::deserialize(deserializer).map(|variant| {
MarkedString::LanguageString {
language: variant.language.into_owned(),
value: variant.value.into_owned(),
}
})
})
}
}
impl serde::Serialize for MarkedString {
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
where S: serde::Serializer
{
match *self {
MarkedString::String(ref s) => serializer.serialize_str(s),
MarkedString::LanguageString { ref language, ref value } => {
#[derive(Serialize)]
struct Variant<'s> {
language: &'s str,
value: &'s str,
}
Variant {
language: language,
value: value,
}
.serialize(serializer)
}
}
}
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct SignatureHelp {
pub signatures: Vec<SignatureInformation>,
#[serde(rename="activeSignature")]
pub active_signature: Option<u64>,
#[serde(rename="activeParameter")]
pub active_parameter: Option<u64>,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct SignatureInformation {
pub label: String,
pub documentation: String,
#[serde(skip_serializing_if="Vec::is_empty")]
pub parameters: Vec<ParameterInformation>,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct ParameterInformation {
pub label: String,
#[serde(skip_serializing_if="String::is_empty")]
pub documentation: String,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct ReferenceParams {
#[serde(rename="textDocument")]
pub text_document: TextDocumentIdentifier,
pub position: Position,
pub context: ReferenceContext,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct ReferenceContext {
#[serde(rename="includeDeclaration")]
pub include_declaration: bool,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DocumentHighlight {
pub range: Range,
pub kind: Option<DocumentHighlightKind>,
}
#[derive(Debug, PartialEq, Copy, Clone)]
pub enum DocumentHighlightKind {
Text = 1,
Read = 2,
Write = 3,
}
impl serde::Deserialize for DocumentHighlightKind {
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
where D: serde::Deserializer
{
Ok(match try!(u8::deserialize(deserializer)) {
1 => DocumentHighlightKind::Text,
2 => DocumentHighlightKind::Read,
3 => DocumentHighlightKind::Write,
_ => {
return Err(D::Error::invalid_value("Expected a value of 1, 2, or 3 to \
deserialze to DocumentHighlightKiny"))
}
})
}
}
impl serde::Serialize for DocumentHighlightKind {
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
where S: serde::Serializer
{
serializer.serialize_u8(*self as u8)
}
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DocumentSymbolParams {
#[serde(rename="textDocument")]
pub text_document: TextDocumentIdentifier,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct SymbolInformation {
pub name: String,
pub kind: SymbolKind,
pub location: Location,
#[serde(rename="containerName")]
pub container_name: String,
}
enum_from_primitive!{
#[derive(Debug, PartialEq, Copy, Clone)]
pub enum SymbolKind {
File = 1,
Module = 2,
Namespace = 3,
Package = 4,
Class = 5,
Method = 6,
Property = 7,
Field = 8,
Constructor = 9,
Enum = 10,
Interface = 11,
Function = 12,
Variable = 13,
Constant = 14,
String = 15,
Number = 16,
Boolean = 17,
Array = 18,
}
}
impl serde::Deserialize for SymbolKind {
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
where D: serde::Deserializer
{
use enum_primitive::FromPrimitive;
let i = try!(u8::deserialize(deserializer));
SymbolKind::from_u8(i).ok_or_else(|| {
D::Error::invalid_value("Expected a value between 1 and 18 (inclusive) to deserialize \
to SymbolKind")
})
}
}
impl serde::Serialize for SymbolKind {
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
where S: serde::Serializer
{
serializer.serialize_u8(*self as u8)
}
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct WorkspaceSymbolParams {
pub query: String,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct CodeActionParams {
pub text_document: TextDocumentIdentifier,
pub range: Range,
pub context: CodeActionContext,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct CodeActionContext {
pub diagnostics: Vec<Diagnostic>,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct CodeLensParams {
#[serde(rename="textDocument")]
pub text_document: TextDocumentIdentifier,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct CodeLens {
pub range: Range,
pub command: Option<Command>,
pub data: Option<Value>,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct RenameParams {
#[serde(rename="textDocument")]
pub text_document: TextDocumentIdentifier,
pub position: Position,
#[serde(rename="newName")]
pub new_name: String,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct ShowMessageParams {
#[serde(rename="type")]
pub typ: MessageType,
pub message: String,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct ShowMessageRequestParams {
#[serde(rename="type")]
pub typ: MessageType,
pub message: String,
#[serde(skip_serializing_if="Vec::is_empty")]
pub actions: Vec<MessageActionItem>,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct MessageActionItem {
pub title: String,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct LogMessageParams {
#[serde(rename="type")]
pub typ: MessageType,
pub message: String,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DidChangeConfigurationParams {
pub settings: Value,
}
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum MessageType {
Error = 1,
Warning = 2,
Info = 3,
Log = 4,
}
impl serde::Deserialize for MessageType {
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
where D: serde::Deserializer
{
Ok(match try!(u8::deserialize(deserializer)) {
1 => MessageType::Error,
2 => MessageType::Warning,
3 => MessageType::Info,
4 => MessageType::Log,
_ => {
return Err(D::Error::invalid_value("Expected a value of 1, 2, 3 or 4 to \
deserialze to MessageType"))
}
})
}
}
impl serde::Serialize for MessageType {
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
where S: serde::Serializer
{
serializer.serialize_u8(*self as u8)
}
}
#[derive(Debug, PartialEq, Default, Deserialize, Serialize)]
pub struct PublishDiagnosticsParams {
pub uri: String,
pub diagnostics: Vec<Diagnostic>,
}
#[derive(Debug, PartialEq, Default, Deserialize, Serialize)]
pub struct Diagnostic {
pub range: Range,
pub severity: Option<DiagnosticSeverity>,
pub code: String,
pub source: Option<String>,
pub message: String,
}
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum DiagnosticSeverity {
Error = 1,
Warning = 2,
Information = 3,
Hint = 4,
}
impl serde::Deserialize for DiagnosticSeverity {
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
where D: serde::Deserializer
{
Ok(match try!(u8::deserialize(deserializer)) {
1 => DiagnosticSeverity::Error,
2 => DiagnosticSeverity::Warning,
3 => DiagnosticSeverity::Information,
4 => DiagnosticSeverity::Hint,
_ => {
return Err(D::Error::invalid_value("Expected a value of 1, 2, 3 or 4 to \
deserialze to DiagnosticSeverity"))
}
})
}
}
impl serde::Serialize for DiagnosticSeverity {
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
where S: serde::Serializer
{
serializer.serialize_u8(*self as u8)
}
}
#[derive(Debug, PartialEq, Default, Deserialize, Serialize)]
pub struct Command {
pub title: String,
pub command: String,
#[serde(skip_serializing_if="Vec::is_empty")]
pub arguments: Vec<Value>,
}