use std::sync::Arc;
use lspf::types::notification::DidOpenTextDocument;
use lspf::types::{
CompletionItem, CompletionOptions, CompletionParams, CompletionResponse,
DidOpenTextDocumentParams, Hover, HoverParams,
};
use lspf::{CancellationToken, Context, LspError, Server};
pub(crate) struct State {
label: String,
}
impl State {
fn new() -> Self {
Self {
label: "shared".to_string(),
}
}
}
async fn hover(
state: Arc<State>,
ctx: Context,
_params: HoverParams,
_ct: CancellationToken,
) -> Result<Option<Hover>, LspError> {
let _ = ctx.workspace().roots();
Ok(Some(Hover {
contents: lspf::types::HoverContents::Scalar(lspf::types::MarkedString::String(
state.label.clone(),
)),
range: None,
}))
}
async fn completion(
_state: Arc<State>,
_ctx: Context,
_params: CompletionParams,
_ct: CancellationToken,
) -> Result<Option<CompletionResponse>, LspError> {
Ok(Some(CompletionResponse::Array(vec![CompletionItem {
label: "shared".to_string(),
..CompletionItem::default()
}])))
}
enum SharedPing {}
impl lspf::types::request::Request for SharedPing {
type Params = String;
type Result = String;
const METHOD: &'static str = "shared/ping";
}
async fn ping(
state: Arc<State>,
_ctx: Context,
params: String,
_ct: CancellationToken,
) -> Result<String, LspError> {
Ok(format!("{}:{params}", state.label))
}
async fn on_did_open(_state: Arc<State>, _ctx: Context, _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()
}