use {
crate::{
Uri,
protocol::{
lsp::{
ChangeAnnotationIdentifier,
DocumentChanges,
NumberOrString,
OneOf,
TextEdit,
WorkspaceFolder,
},
macros::lsp_enum,
},
},
serde::{
Deserialize,
Serialize,
},
std::collections::HashMap,
};
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct RegularExpressionsClientCapabilities {
pub engine: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
}
#[derive(
Debug,
Clone,
Copy,
Default,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
Deserialize,
Serialize,
)]
pub struct Position {
pub line: u32,
pub character: u32,
}
impl Position {
#[must_use]
pub const fn new(line: u32, character: u32) -> Self {
Self { line, character }
}
}
#[derive(
Debug, Clone, PartialEq, Eq, PartialOrd, Deserialize, Serialize, Hash,
)]
pub struct PositionEncodingKind(std::borrow::Cow<'static, str>);
impl PositionEncodingKind {
pub const UTF16: Self = Self::new("utf-16");
pub const DEFAULT: Self = Self::UTF16;
pub const UTF32: Self = Self::new("utf-32");
pub const UTF8: Self = Self::new("utf-8");
#[must_use]
pub const fn new(tag: &'static str) -> Self {
Self(std::borrow::Cow::Borrowed(tag))
}
#[must_use]
pub fn as_str(&self) -> &str {
&self.0
}
}
impl From<String> for PositionEncodingKind {
fn from(from: String) -> Self {
Self(std::borrow::Cow::from(from))
}
}
impl From<&'static str> for PositionEncodingKind {
fn from(from: &'static str) -> Self {
Self::new(from)
}
}
#[derive(
Debug, Default, Clone, Copy, PartialEq, Eq, Deserialize, Serialize, Hash,
)]
pub struct Range {
pub start: Position,
pub end: Position,
}
impl Range {
#[must_use]
pub const fn new(start: Position, end: Position) -> Self {
Self { start, end }
}
}
pub type Pattern = String;
#[derive(
Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Deserialize, Serialize,
)]
#[serde(rename_all = "camelCase")]
pub struct RelativePattern {
pub base_uri: OneOf<WorkspaceFolder, Uri>,
pub pattern: Pattern,
}
#[derive(
Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Deserialize, Serialize,
)]
#[serde(untagged)]
pub enum GlobPattern {
String(Pattern),
Relative(RelativePattern),
}
impl From<Pattern> for GlobPattern {
#[inline]
fn from(from: Pattern) -> Self {
Self::String(from)
}
}
impl From<RelativePattern> for GlobPattern {
#[inline]
fn from(from: RelativePattern) -> Self {
Self::Relative(from)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize, Hash)]
pub struct Location {
pub uri: Uri,
pub range: Range,
}
impl Location {
#[must_use]
pub const fn new(uri: Uri, range: Range) -> Self {
Self { uri, range }
}
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct LocationLink {
#[serde(skip_serializing_if = "Option::is_none")]
pub origin_selection_range: Option<Range>,
pub target_uri: Uri,
pub target_range: Range,
pub target_selection_range: Range,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct Command {
pub title: String,
pub command: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub arguments: Option<Vec<serde_json::Value>>,
}
impl Command {
#[must_use]
pub const fn new(
title: String,
command: String,
arguments: Option<Vec<serde_json::Value>>,
) -> Self {
Self {
title,
command,
arguments,
}
}
}
#[derive(Default, Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum MarkupKind {
#[default]
PlainText,
Markdown,
}
#[derive(Default, Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct MarkupContent {
pub kind: MarkupKind,
pub value: String,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct MarkdownClientCapabilities {
pub parser: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_tags: Option<Vec<String>>,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateFileOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub overwrite: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ignore_if_exists: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateFile {
pub uri: Uri,
#[serde(skip_serializing_if = "Option::is_none")]
pub options: Option<CreateFileOptions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub annotation_id: Option<ChangeAnnotationIdentifier>,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct RenameFileOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub overwrite: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ignore_if_exists: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct RenameFile {
pub old_uri: Uri,
pub new_uri: Uri,
#[serde(skip_serializing_if = "Option::is_none")]
pub options: Option<RenameFileOptions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub annotation_id: Option<ChangeAnnotationIdentifier>,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DeleteFileOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub recursive: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ignore_if_not_exists: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DeleteFile {
pub uri: Uri,
#[serde(skip_serializing_if = "Option::is_none")]
pub options: Option<DeleteFileOptions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub annotation_id: Option<ChangeAnnotationIdentifier>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WorkspaceEditClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub document_changes: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resource_operations: Option<Vec<ResourceOperationKind>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub failure_handling: Option<FailureHandlingKind>,
#[serde(skip_serializing_if = "Option::is_none")]
pub normalizes_line_endings: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub change_annotation_support:
Option<ChangeAnnotationWorkspaceEditClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata_support: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub snippet_edit_support: Option<bool>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ChangeAnnotationWorkspaceEditClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub groups_on_label: Option<bool>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum ResourceOperationKind {
Create,
Rename,
Delete,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub enum FailureHandlingKind {
Abort,
Transactional,
TextOnlyTransactional,
Undo,
}
#[derive(
Debug, Default, Clone, Copy, PartialEq, Eq, Deserialize, Serialize,
)]
#[serde(rename_all = "camelCase")]
pub enum TraceValue {
#[default]
Off,
Messages,
Verbose,
}