use std::path::PathBuf;
use std::sync::Arc;
use async_trait::async_trait;
use ls_types::Uri;
use parking_lot::RwLock;
use crate::config::ServerSettings;
use crate::core::client::{MetadataProvider, WorkspaceLoader};
use crate::semantic::types::{LiveMetadataSnapshot, WorkspaceIndex};
#[derive(Default)]
pub struct HostPushedWorkspaceStore {
inner: RwLock<WorkspaceIndex>,
}
impl HostPushedWorkspaceStore {
pub fn snapshot(&self) -> WorkspaceIndex {
self.inner.read().clone()
}
pub fn replace(&self, workspace: WorkspaceIndex) {
*self.inner.write() = workspace;
}
}
#[derive(Default)]
pub struct HostPushedMetadataStore {
inner: RwLock<LiveMetadataSnapshot>,
}
impl HostPushedMetadataStore {
pub fn snapshot(&self) -> LiveMetadataSnapshot {
self.inner.read().clone()
}
pub fn replace(&self, snapshot: LiveMetadataSnapshot) {
*self.inner.write() = snapshot;
}
}
pub struct HostPushedWorkspace {
store: Arc<HostPushedWorkspaceStore>,
}
impl HostPushedWorkspace {
pub fn new(store: Arc<HostPushedWorkspaceStore>) -> Self {
Self { store }
}
}
#[async_trait]
impl WorkspaceLoader for HostPushedWorkspace {
async fn load(&self, _folders: &[PathBuf]) -> WorkspaceIndex {
self.store.snapshot()
}
async fn read_document(&self, uri: &Uri) -> Option<String> {
self.store
.snapshot()
.documents
.get(uri)
.map(|analysis| analysis.text.clone())
}
}
pub struct HostPushedMetadata {
store: Arc<HostPushedMetadataStore>,
}
impl HostPushedMetadata {
pub fn new(store: Arc<HostPushedMetadataStore>) -> Self {
Self { store }
}
}
#[async_trait]
impl MetadataProvider for HostPushedMetadata {
async fn fetch(&self, _settings: &ServerSettings) -> LiveMetadataSnapshot {
self.store.snapshot()
}
}