diff --git a/src/lsp.rs b/src/lsp.rs new file mode 100644 index 0000000..349bcf5 --- /dev/null +++ b/src/lsp.rs @@ -0,0 +1,57 @@ +use lspower::jsonrpc::Result; +use lspower::lsp::{self, *}; +use lspower::{Client, LanguageServer, LspService, Server}; +use lspower; + +#[derive(Debug)] +struct Backend { + client: Client, +} + +#[lspower::async_trait] +impl LanguageServer for Backend { + async fn initialize(&self, _: InitializeParams) -> Result { + // Ok(InitializeResult::default()) + Ok(InitializeResult { + capabilities: ServerCapabilities { + completion_provider: Some(CompletionOptions { + trigger_characters: vec!["::".to_string()].into(), + ..CompletionOptions::default() + }), + ..ServerCapabilities::default() + }, + ..InitializeResult::default() + }) + } + + async fn initialized(&self, _: InitializedParams) { + self.client + .log_message(MessageType::INFO, "Wyst LSP initialized!") + .await; + } + + async fn completion( + &self, + _params: lsp::CompletionParams, + ) -> lspower::jsonrpc::Result> { + Ok(Some(CompletionResponse::Array(vec![ + CompletionItem::new_simple("mylabel".to_string(), "mydetail".to_string()) + ]))) + } + + async fn shutdown(&self) -> Result<()> { + Ok(()) + } +} + +#[tokio::main] +pub async fn run_lsp_server() { + let stdin = tokio::io::stdin(); + let stdout = tokio::io::stdout(); + + let (service, messages) = LspService::new(|client| Backend { client }); + Server::new(stdin, stdout) + .interleave(messages) + .serve(service) + .await; +} \ No newline at end of file