qlue-ls 2.8.1

A language server for SPARQL
Documentation
mod query;
mod update;
mod utils;

use crate::server::{
    Server,
    lsp::{
        ExecuteOperationRequest, ExecuteOperationSource,
        errors::{ErrorCode, LSPError},
    },
    message_handler::execute::{
        query::handle_execute_query_request, update::handle_execute_update_request,
    },
};
use futures::lock::Mutex;
use ll_sparql_parser::{TopEntryPoint, guess_operation_type};
use std::rc::Rc;

#[tracing::instrument(skip_all, fields(id = %request.get_id()))]
pub(super) async fn handle_execute_request(
    server_rc: Rc<Mutex<Server>>,
    request: ExecuteOperationRequest,
) -> Result<(), LSPError> {
    let (query, url, engine) = {
        let server = server_rc.lock().await;
        let text = match &request.params.source {
            ExecuteOperationSource::Document { text_document } => {
                server.state.get_document(&text_document.uri)?.text.clone()
            }
            ExecuteOperationSource::Inline { query } => query.clone(),
        };
        let service = server.state.get_default_backend().ok_or(LSPError::new(
            ErrorCode::InvalidRequest,
            "Can not execute operation, no SPARQL endpoint was specified",
        ))?;
        (text, service.url.clone(), service.engine.clone())
    };

    match guess_operation_type(&query) {
        Some(TopEntryPoint::QueryUnit) => {
            handle_execute_query_request(server_rc, request, url, query, engine).await
        }
        Some(TopEntryPoint::UpdateUnit) => {
            handle_execute_update_request(server_rc, request, url, query).await
        }
        None => {
            tracing::warn!("Could not determine operation type.\nFalling back to Query.");
            handle_execute_query_request(server_rc, request, url, query, engine).await
        }
    }
}