athena_rs 3.26.1

Hyper performant polyglot Database driver
Documentation
//! `/schema` response orchestration helpers.
//!
//! This module composes overview loader rows with presentation/error mapping.

use actix_web::HttpResponse;
use sqlx::{Pool, Postgres};

use super::super::catalog_errors::schema_processed_query_error;
use super::super::catalog_service_loader::load_schema_overview_rows;
use super::super::presentation::schema_overview as build_schema_overview_payload;
use super::super::schema_backend::SchemaBackend;

/// Builds a `/schema` response for one validated schema name.
pub(in super::super) async fn schema_overview_response(
    backend: &SchemaBackend,
    app_state: &crate::AppState,
    schema_name: String,
) -> HttpResponse {
    match backend {
        SchemaBackend::Postgres { pool } => {
            let overview_rows = match load_schema_overview_rows(pool, schema_name.as_str()).await {
                Ok(rows) => rows,
                Err(err) => return schema_processed_query_error(&err, Some(schema_name.as_str())),
            };

            HttpResponse::Ok().json(build_schema_overview_payload(
                schema_name,
                overview_rows.relations,
                overview_rows.columns,
            ))
        }
        SchemaBackend::D1 { connection_info } => {
            match super::super::schema_d1::load_schema_overview_rows(
                app_state,
                connection_info,
                schema_name.as_str(),
            )
            .await
            {
                Ok(rows) => HttpResponse::Ok().json(build_schema_overview_payload(
                    schema_name,
                    rows.relations,
                    rows.columns,
                )),
                Err(resp) => resp,
            }
        }
    }
}