rototo 0.1.0-alpha.4

Control plane for runtime configuration of your application.
Documentation
use serde::Serialize;
use serde_json::{Value as JsonValue, json};

const TEXT_DOCUMENT_SYNC_KIND_FULL: u8 = 1;

#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub(super) struct PublishDiagnosticsParams {
    pub(super) uri: String,
    pub(super) version: Option<i32>,
    pub(super) diagnostics: Vec<LspDiagnostic>,
}

#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub(super) struct LspDiagnostic {
    pub(super) range: LspRange,
    pub(super) severity: u8,
    pub(super) source: &'static str,
    pub(super) code: String,
    pub(super) message: String,
    #[serde(skip_serializing_if = "Vec::is_empty")]
    pub(super) related_information: Vec<LspDiagnosticRelatedInformation>,
    pub(super) data: LspDiagnosticData,
}

#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub(super) struct LspDiagnosticRelatedInformation {
    pub(super) location: LspLocation,
    pub(super) message: String,
}

#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub(super) struct LspDiagnosticData {
    pub(super) rule: String,
    pub(super) stage: String,
    pub(super) help: String,
}

#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub(super) struct LspDocumentSymbol {
    pub(super) name: String,
    pub(super) kind: u8,
    pub(super) range: LspRange,
    pub(super) selection_range: LspRange,
    #[serde(skip_serializing_if = "Vec::is_empty")]
    pub(super) children: Vec<LspDocumentSymbol>,
}

#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub(super) struct LspCompletionItem {
    pub(super) label: String,
    pub(super) kind: u8,
    pub(super) detail: &'static str,
}

#[derive(Debug, Serialize)]
pub(super) struct LspHover {
    pub(super) contents: LspMarkupContent,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub(super) range: Option<LspRange>,
}

#[derive(Debug, Serialize)]
pub(super) struct LspLocation {
    pub(super) uri: String,
    pub(super) range: LspRange,
}

#[derive(Debug, Serialize)]
pub(super) struct LspMarkupContent {
    pub(super) kind: &'static str,
    pub(super) value: String,
}

#[derive(Debug, Serialize, Clone, Copy)]
pub(super) struct LspRange {
    pub(super) start: LspPosition,
    pub(super) end: LspPosition,
}

#[derive(Debug, Serialize, Clone, Copy)]
pub(super) struct LspPosition {
    pub(super) line: usize,
    pub(super) character: usize,
}

pub(super) fn initialize_result() -> JsonValue {
    json!({
        "capabilities": {
            "positionEncoding": "utf-16",
            "textDocumentSync": {
                "openClose": true,
                "change": TEXT_DOCUMENT_SYNC_KIND_FULL,
                "save": {
                    "includeText": false
                }
            },
            "documentSymbolProvider": true,
            "completionProvider": {
                "resolveProvider": false,
                "triggerCharacters": [".", "\""]
            },
            "hoverProvider": true,
            "definitionProvider": true,
            "referencesProvider": true
        },
        "serverInfo": {
            "name": "rototo",
            "version": env!("CARGO_PKG_VERSION")
        }
    })
}