use lsp_types::CompletionOptions;
use lsp_types::request::{Completion, HoverRequest, Request, ResolveCompletionItem};
use crate::capability::CapabilityBuilder;
use crate::error::BuildError;
pub(crate) mod sealed {
use crate::capability::CapabilityBuilder;
use crate::error::BuildError;
#[allow(private_interfaces)]
pub trait Sealed {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError>;
}
}
pub trait FeatureSpec: sealed::Sealed {
type Marker: Request;
}
pub struct HoverFeature(());
pub fn hover() -> HoverFeature {
HoverFeature(())
}
#[allow(private_interfaces)]
impl sealed::Sealed for HoverFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_hover()
}
}
impl FeatureSpec for HoverFeature {
type Marker = HoverRequest;
}
pub struct CompletionFeature {
options: CompletionOptions,
}
pub fn completion(options: CompletionOptions) -> CompletionFeature {
CompletionFeature { options }
}
#[allow(private_interfaces)]
impl sealed::Sealed for CompletionFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_completion(self.options.clone())
}
}
impl FeatureSpec for CompletionFeature {
type Marker = Completion;
}
pub struct CompletionResolveFeature(());
pub fn completion_resolve() -> CompletionResolveFeature {
CompletionResolveFeature(())
}
#[allow(private_interfaces)]
impl sealed::Sealed for CompletionResolveFeature {
fn contribute(&self, caps: &mut CapabilityBuilder) -> Result<(), BuildError> {
caps.set_completion_resolve();
Ok(())
}
}
impl FeatureSpec for CompletionResolveFeature {
type Marker = ResolveCompletionItem;
}