omena-lsp-server 0.3.0

Rust LSP server boundary scaffold for Omena CSS Modules
Documentation
use omena_query::{OmenaQuerySourceDocumentInputV0, OmenaQueryStyleSourceInputV0};

use crate::{
    LspQueryReadView,
    protocol::{is_style_document_uri, workspace_folder_compatible},
};

pub(crate) fn style_sources_from_open_documents(
    state: &dyn LspQueryReadView,
    workspace_folder_uri: Option<&str>,
    required_document_uri: Option<&str>,
) -> Vec<OmenaQueryStyleSourceInputV0> {
    let mut sources = state
        .query_documents()
        .values()
        .filter(|document| {
            is_style_document_uri(document.uri.as_str())
                && workspace_folder_compatible(workspace_folder_uri, document)
        })
        .map(|document| OmenaQueryStyleSourceInputV0 {
            style_path: document.uri.clone(),
            style_source: document.text.clone(),
        })
        .collect::<Vec<_>>();
    if let Some(required_document_uri) = required_document_uri
        && !sources
            .iter()
            .any(|source| source.style_path == required_document_uri)
        && let Some(document) = state.document(required_document_uri)
    {
        sources.push(OmenaQueryStyleSourceInputV0 {
            style_path: document.uri.clone(),
            style_source: document.text.clone(),
        });
    }
    sources
}

#[cfg(feature = "salsa-style-diagnostics")]
pub(crate) fn style_path_inputs_from_open_documents(
    state: &dyn LspQueryReadView,
    workspace_folder_uri: Option<&str>,
    required_document_uri: Option<&str>,
) -> Vec<OmenaQueryStyleSourceInputV0> {
    let mut sources = state
        .query_documents()
        .values()
        .filter(|document| {
            is_style_document_uri(document.uri.as_str())
                && workspace_folder_compatible(workspace_folder_uri, document)
        })
        .map(|document| OmenaQueryStyleSourceInputV0 {
            style_path: document.uri.clone(),
            style_source: String::new(),
        })
        .collect::<Vec<_>>();
    if let Some(required_document_uri) = required_document_uri
        && !sources
            .iter()
            .any(|source| source.style_path == required_document_uri)
        && let Some(document) = state.document(required_document_uri)
    {
        sources.push(OmenaQueryStyleSourceInputV0 {
            style_path: document.uri.clone(),
            style_source: String::new(),
        });
    }
    sources
}

pub(crate) fn source_documents_from_open_documents(
    state: &dyn LspQueryReadView,
    workspace_folder_uri: Option<&str>,
) -> Vec<OmenaQuerySourceDocumentInputV0> {
    state
        .query_documents()
        .values()
        .filter(|document| {
            !is_style_document_uri(document.uri.as_str())
                && workspace_folder_compatible(workspace_folder_uri, document)
        })
        .map(|document| OmenaQuerySourceDocumentInputV0 {
            source_path: document.uri.clone(),
            source_source: document.text.clone(),
            source_syntax_index: Some(document.source_syntax_index.clone()),
            has_unresolved_style_import: document.has_unresolved_style_import,
        })
        .collect()
}

pub(crate) fn style_sources_for_hover_render(
    state: &dyn LspQueryReadView,
    workspace_folder_uri: Option<&str>,
    document_uri: &str,
    source: &str,
) -> Vec<OmenaQueryStyleSourceInputV0> {
    let mut style_sources =
        style_sources_from_open_documents(state, workspace_folder_uri, Some(document_uri));
    if !style_sources
        .iter()
        .any(|style_source| style_source.style_path == document_uri)
    {
        style_sources.push(OmenaQueryStyleSourceInputV0 {
            style_path: document_uri.to_string(),
            style_source: source.to_string(),
        });
    }
    style_sources
}