datasources 0.1.25

Async datasource interfaces, middleware, registry, and test doubles
Documentation
use super::create_bulk_create_stored_procedure_statement::CreateBulkCreateStoredProcedureStatement;
use super::create_bulk_delete_stored_procedure_statement::CreateBulkDeleteStoredProcedureStatement;
use super::create_bulk_update_stored_procedure_statement::CreateBulkUpdateStoredProcedureStatement;
use super::create_create_stored_procedure_statement::CreateCreateStoredProcedureStatement;
use super::create_delete_stored_procedure_statement::CreateDeleteStoredProcedureStatement;
use super::create_read_stored_procedure_statement::CreateReadStoredProcedureStatement;
use super::create_update_stored_procedure_statement::CreateUpdateStoredProcedureStatement;
use super::procedure_source::ProcedureSource;
use super::routine_parameter::RoutineParameter;
use super::statement::Statement;

pub fn sql_procedure_statements_of(source: &ProcedureSource) -> Vec<Box<dyn Statement>> {
    let name = |stem: &str| (source.routine_name)(stem);
    let plural = &source.plural;
    let payload = RoutineParameter::new("payload", "payload");
    let mut statements: Vec<Box<dyn Statement>> = vec![
        Box::new(CreateCreateStoredProcedureStatement::new(
            name(&format!("create_{plural}")),
            &source.table,
            source.columns.clone(),
            source.create_parameters.clone(),
            &source.key,
            &source.key_type,
            source.writable.clone(),
            source.generated_key,
            source.audit_updated.clone(),
        )),
        Box::new(CreateReadStoredProcedureStatement::new(
            name(&format!("read_{plural}")),
            &source.table,
            source.columns.clone(),
            Vec::new(),
            &source.key,
            &source.key_type,
            source.writable.clone(),
            Vec::new(),
            source.generated_key,
            source.audit_updated.clone(),
        )),
    ];
    for group in &source.by_groups {
        let suffix = format!("_by_{}", group.logical.join("_"));
        statements.push(Box::new(CreateReadStoredProcedureStatement::new(
            name(&format!("read_{plural}{suffix}")),
            &source.table,
            source.columns.clone(),
            group.parameters.clone(),
            &source.key,
            &source.key_type,
            source.writable.clone(),
            group.columns.clone(),
            source.generated_key,
            source.audit_updated.clone(),
        )));
        statements.push(Box::new(CreateUpdateStoredProcedureStatement::new(
            name(&format!("update_{plural}{suffix}")),
            &source.table,
            source.columns.clone(),
            group.update_parameters.clone(),
            &source.key,
            &source.key_type,
            source.writable.clone(),
            group.columns.clone(),
            source.generated_key,
            source.audit_updated.clone(),
        )));
        statements.push(Box::new(CreateDeleteStoredProcedureStatement::new(
            name(&format!("delete_{plural}{suffix}")),
            &source.table,
            source.columns.clone(),
            group.parameters.clone(),
            &source.key,
            &source.key_type,
            source.writable.clone(),
            group.columns.clone(),
            source.generated_key,
            source.audit_updated.clone(),
        )));
    }
    statements.push(Box::new(CreateBulkCreateStoredProcedureStatement::new(
        name(&format!("bulk_create_{plural}")),
        &source.table,
        source.create_columns.clone(),
        payload.clone(),
        &source.key,
        &source.key_type,
    )));
    statements.push(Box::new(CreateBulkUpdateStoredProcedureStatement::new(
        name(&format!("bulk_update_{plural}")),
        &source.table,
        source.update_columns.clone(),
        payload.clone(),
        &source.key,
        &source.key_type,
    )));
    statements.push(Box::new(CreateBulkDeleteStoredProcedureStatement::new(
        name(&format!("bulk_delete_{plural}")),
        &source.table,
        source.typed_columns.clone(),
        payload,
        &source.key,
        &source.key_type,
    )));
    statements
}

pub fn procedure_name_of(statement: &dyn Statement) -> String {
    if let Some(s) = statement.as_any().downcast_ref::<CreateCreateStoredProcedureStatement>() {
        return s.name().to_string();
    }
    if let Some(s) = statement.as_any().downcast_ref::<CreateReadStoredProcedureStatement>() {
        return s.name().to_string();
    }
    if let Some(s) = statement.as_any().downcast_ref::<CreateUpdateStoredProcedureStatement>() {
        return s.name().to_string();
    }
    if let Some(s) = statement.as_any().downcast_ref::<CreateDeleteStoredProcedureStatement>() {
        return s.name().to_string();
    }
    if let Some(s) = statement.as_any().downcast_ref::<CreateBulkCreateStoredProcedureStatement>() {
        return s.name().to_string();
    }
    if let Some(s) = statement.as_any().downcast_ref::<CreateBulkUpdateStoredProcedureStatement>() {
        return s.name().to_string();
    }
    if let Some(s) = statement.as_any().downcast_ref::<CreateBulkDeleteStoredProcedureStatement>() {
        return s.name().to_string();
    }
    panic!("procedure statement has no name");
}