use std::sync::Arc;
use serde::{Deserialize, Serialize};
use lspf::types::notification::DidOpenTextDocument;
use lspf::types::{
CompletionItem, CompletionOptions, CompletionParams, CompletionResponse,
DidOpenTextDocumentParams, Hover, HoverParams, MarkupContent, MarkupKind,
};
use lspf::{CancellationToken, LspError, Server, ServerContext};
pub(crate) struct State {
label: String,
}
impl State {
fn new() -> Self {
Self {
label: "shared".to_string(),
}
}
}
async fn hover(
state: Arc<State>,
ctx: ServerContext,
_params: HoverParams,
_ct: CancellationToken,
) -> Result<Option<Hover>, LspError> {
let _ = ctx.workspace().roots();
Ok(Some(Hover {
contents: lspf::types::HoverContents::MarkupContent(MarkupContent::new(
MarkupKind::Markdown,
state.label.clone(),
)),
range: None,
}))
}
async fn completion(
_state: Arc<State>,
_ctx: ServerContext,
_params: CompletionParams,
_ct: CancellationToken,
) -> Result<Option<CompletionResponse>, LspError> {
Ok(Some(CompletionResponse::CompletionItemList(vec![
CompletionItem {
label: "shared".to_string(),
..CompletionItem::default()
},
])))
}
#[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct SharedPingParams {
pub(crate) message: String,
}
#[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct SharedPingResult {
pub(crate) reply: String,
}
enum SharedPing {}
impl lspf::types::request::Request for SharedPing {
type Params = SharedPingParams;
type Result = SharedPingResult;
const METHOD: &'static str = "shared/ping";
}
async fn ping(
state: Arc<State>,
_ctx: ServerContext,
params: SharedPingParams,
_ct: CancellationToken,
) -> Result<SharedPingResult, LspError> {
Ok(SharedPingResult {
reply: format!("{}:{}", state.label, params.message),
})
}
async fn on_did_open(_state: Arc<State>, _ctx: ServerContext, _params: DidOpenTextDocumentParams) {}
pub(crate) fn build() -> Result<Server<State>, lspf::BuildError> {
Server::builder(State::new())
.feature(lspf::features::hover(), hover)
.feature(
lspf::features::completion(CompletionOptions::default()),
completion,
)
.request::<SharedPing, _, _>(ping)
.notification::<DidOpenTextDocument, _, _>(on_did_open)
.build()
}