use std::collections::BTreeSet;
use lspkit_vfs::PositionEncoding;
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum TextSync {
None,
Full,
#[default]
Incremental,
}
#[non_exhaustive]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum Feature {
Completion,
Hover,
Definition,
References,
DiagnosticsPull,
}
#[non_exhaustive]
#[derive(Debug, Clone)]
pub struct Capabilities {
encoding: PositionEncoding,
text_sync: TextSync,
features: BTreeSet<Feature>,
}
impl Capabilities {
#[must_use]
pub fn new() -> Self {
Self {
encoding: PositionEncoding::default(),
text_sync: TextSync::default(),
features: BTreeSet::new(),
}
}
#[must_use]
pub fn position_encoding(mut self, encoding: PositionEncoding) -> Self {
self.encoding = encoding;
self
}
#[must_use]
pub fn text_sync(mut self, kind: TextSync) -> Self {
self.text_sync = kind;
self
}
#[must_use]
pub fn enable(mut self, feature: Feature) -> Self {
self.features.insert(feature);
self
}
#[must_use]
pub fn has(&self, feature: Feature) -> bool {
self.features.contains(&feature)
}
#[must_use]
pub fn encoding(&self) -> PositionEncoding {
self.encoding
}
#[must_use]
pub fn text_sync_kind(&self) -> TextSync {
self.text_sync
}
#[must_use]
pub fn features(&self) -> Vec<Feature> {
self.features.iter().copied().collect()
}
}
impl Default for Capabilities {
fn default() -> Self {
Self::new()
}
}