use dashmap::DashMap;
use parking_lot::RwLock;
use tower_lsp::lsp_types::Url;
use crate::document::DocumentStore;
use crate::virtual_code::{VirtualCodeGenerator, VirtualDocuments};
pub struct ServerState {
pub documents: DocumentStore,
virtual_gen: RwLock<VirtualCodeGenerator>,
virtual_docs_cache: DashMap<Url, VirtualDocuments>,
}
impl Default for ServerState {
fn default() -> Self {
Self::new()
}
}
impl ServerState {
pub fn new() -> Self {
Self {
documents: DocumentStore::new(),
virtual_gen: RwLock::new(VirtualCodeGenerator::new()),
virtual_docs_cache: DashMap::new(),
}
}
pub fn update_virtual_docs(&self, uri: &Url, content: &str) {
let options = vize_atelier_sfc::SfcParseOptions {
filename: uri.path().to_string(),
..Default::default()
};
if let Ok(descriptor) = vize_atelier_sfc::parse_sfc(content, options) {
let base_uri = uri.path();
let virtual_docs = self.virtual_gen.write().generate(&descriptor, base_uri);
self.virtual_docs_cache.insert(uri.clone(), virtual_docs);
}
}
pub fn get_virtual_docs(
&self,
uri: &Url,
) -> Option<dashmap::mapref::one::Ref<'_, Url, VirtualDocuments>> {
self.virtual_docs_cache.get(uri)
}
pub fn remove_virtual_docs(&self, uri: &Url) {
self.virtual_docs_cache.remove(uri);
}
pub fn clear_virtual_docs(&self) {
self.virtual_docs_cache.clear();
}
}