use lsp::{Uri, VersionedTextDocumentIdentifier}; use serde::{Deserialize, Serialize}; pub enum CheckStatus {} #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct CheckStatusParams { pub local_checks_only: bool, } impl lsp::request::Request for CheckStatus { type Params = CheckStatusParams; type Result = SignInStatus; const METHOD: &'static str = "checkStatus"; } pub enum SignIn {} #[derive(Debug, Serialize, Deserialize)] pub struct SignInParams {} #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct PromptUserDeviceFlow { pub user_code: String, pub command: lsp::Command, } impl lsp::request::Request for SignIn { type Params = SignInParams; type Result = PromptUserDeviceFlow; const METHOD: &'static str = "signIn"; } #[derive(Debug, Serialize, Deserialize)] #[serde(tag = "status")] pub enum SignInStatus { #[serde(rename = "OK")] Ok { user: Option, }, MaybeOk { user: String, }, AlreadySignedIn { user: String, }, NotAuthorized { user: String, }, NotSignedIn, } pub enum SignOut {} #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct SignOutParams {} #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct SignOutResult {} impl lsp::request::Request for SignOut { type Params = SignOutParams; type Result = SignOutResult; const METHOD: &'static str = "signOut"; } pub enum DidChangeStatus {} #[derive(Debug, Serialize, Deserialize)] pub struct DidChangeStatusParams { #[serde(default)] pub message: Option, pub kind: StatusKind, } #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] pub enum StatusKind { Normal, Error, Warning, Inactive, } impl lsp::notification::Notification for DidChangeStatus { type Params = DidChangeStatusParams; const METHOD: &'static str = "didChangeStatus"; } pub enum SetEditorInfo {} #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct SetEditorInfoParams { pub editor_info: EditorInfo, pub editor_plugin_info: EditorPluginInfo, } impl lsp::request::Request for SetEditorInfo { type Params = SetEditorInfoParams; type Result = String; const METHOD: &'static str = "setEditorInfo"; } #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct EditorInfo { pub name: String, pub version: String, } #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct EditorPluginInfo { pub name: String, pub version: String, } pub enum NotifyAccepted {} #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct NotifyAcceptedParams { pub uuid: String, } impl lsp::request::Request for NotifyAccepted { type Params = NotifyAcceptedParams; type Result = String; const METHOD: &'static str = "notifyAccepted"; } pub enum NotifyRejected {} #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct NotifyRejectedParams { pub uuids: Vec, } impl lsp::request::Request for NotifyRejected { type Params = NotifyRejectedParams; type Result = String; const METHOD: &'static str = "notifyRejected"; } #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct NextEditSuggestions; #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct NextEditSuggestionsParams { pub(crate) text_document: VersionedTextDocumentIdentifier, pub(crate) position: lsp::Position, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct NextEditSuggestion { pub text: String, pub text_document: VersionedTextDocumentIdentifier, pub range: lsp::Range, pub command: Option, } #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct NextEditSuggestionsResult { pub edits: Vec, } impl lsp::request::Request for NextEditSuggestions { type Params = NextEditSuggestionsParams; type Result = NextEditSuggestionsResult; const METHOD: &'static str = "textDocument/copilotInlineEdit"; } pub(crate) struct DidFocus; #[derive(Serialize, Deserialize)] pub(crate) struct DidFocusParams { #[serde(skip_serializing_if = "Option::is_none")] pub(crate) uri: Option, } impl lsp::notification::Notification for DidFocus { type Params = DidFocusParams; const METHOD: &'static str = "textDocument/didFocus"; } pub(crate) struct DidShowInlineEdit; #[derive(Serialize, Deserialize)] pub(crate) struct DidShowInlineEditParams { pub(crate) item: serde_json::Value, } impl lsp::notification::Notification for DidShowInlineEdit { type Params = DidShowInlineEditParams; const METHOD: &'static str = "textDocument/didShowInlineEdit"; } // Inline Completions (non-NES) - textDocument/inlineCompletion pub enum InlineCompletions {} #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct InlineCompletionsParams { pub text_document: VersionedTextDocumentIdentifier, pub position: lsp::Position, pub context: InlineCompletionContext, #[serde(skip_serializing_if = "Option::is_none")] pub formatting_options: Option, } #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct InlineCompletionContext { pub trigger_kind: InlineCompletionTriggerKind, } #[derive(Debug, Clone, Copy)] pub enum InlineCompletionTriggerKind { Invoked = 1, Automatic = 2, } impl Serialize for InlineCompletionTriggerKind { fn serialize(&self, serializer: S) -> Result where S: serde::Serializer, { serializer.serialize_u8(*self as u8) } } impl<'de> Deserialize<'de> for InlineCompletionTriggerKind { fn deserialize(deserializer: D) -> Result where D: serde::Deserializer<'de>, { let value = u8::deserialize(deserializer)?; match value { 1 => Ok(InlineCompletionTriggerKind::Invoked), 2 => Ok(InlineCompletionTriggerKind::Automatic), _ => Err(serde::de::Error::custom("invalid trigger kind")), } } } #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct FormattingOptions { pub tab_size: u32, pub insert_spaces: bool, } #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct InlineCompletionsResult { pub items: Vec, } #[derive(Clone, Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct InlineCompletionItem { pub insert_text: String, pub range: lsp::Range, #[serde(skip_serializing_if = "Option::is_none")] pub command: Option, } impl lsp::request::Request for InlineCompletions { type Params = InlineCompletionsParams; type Result = InlineCompletionsResult; const METHOD: &'static str = "textDocument/inlineCompletion"; } // Telemetry notifications for inline completions pub(crate) struct DidShowCompletion; #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub(crate) struct DidShowCompletionParams { pub(crate) item: InlineCompletionItem, } impl lsp::notification::Notification for DidShowCompletion { type Params = DidShowCompletionParams; const METHOD: &'static str = "textDocument/didShowCompletion"; }