jig-sqlx 0.2.0-beta.1

SQLx feature-area checks and contract metadata for Jig.
Documentation
use jig_contract::{FeatureContext, FeatureDescriptor, NativeToolDescriptor, NativeToolKind, tool};

const MIGRATION_ADD_COMMAND: &str = "migration_add_command";
const SCHEMA_CHECK_COMMAND: &str = "schema_check_command";
const SCHEMA_DUMP_COMMAND: &str = "schema_dump_command";
const SQLX_CHECK_COMMAND: &str = "sqlx_check_command";
const COMMAND_KEYS: &[&str] = &[
    MIGRATION_ADD_COMMAND,
    SCHEMA_CHECK_COMMAND,
    SCHEMA_DUMP_COMMAND,
    SQLX_CHECK_COMMAND,
];
const NATIVE_TOOLS: &[NativeToolDescriptor] = &[
    NativeToolDescriptor::new(tool::MIGRATION_ADD, true, NativeToolKind::MigrationAdd),
    NativeToolDescriptor::new(tool::SCHEMA_CHECK, false, NativeToolKind::SchemaCheck),
];

pub const FEATURE: FeatureDescriptor = FeatureDescriptor::new(
    COMMAND_KEYS,
    NATIVE_TOOLS,
    required_tools,
    unavailable_tool_message,
);

fn required_tools(ctx: &dyn FeatureContext) -> Vec<&'static str> {
    let mut required = Vec::new();
    let sqlx_enabled = ctx.sqlx_enabled();
    let schema_dump_enabled = sqlx_enabled && ctx.schema_dump_enabled();

    if sqlx_enabled || ctx.has_required_command(SQLX_CHECK_COMMAND) {
        required.push(tool::SQLX_CHECK);
    }
    if sqlx_enabled || ctx.has_required_command(MIGRATION_ADD_COMMAND) {
        required.push(tool::MIGRATION_ADD);
    }
    if schema_dump_enabled || ctx.has_required_command(SCHEMA_CHECK_COMMAND) {
        required.push(tool::SCHEMA_CHECK);
    }
    if schema_dump_enabled || ctx.has_required_command(SCHEMA_DUMP_COMMAND) {
        required.push(tool::SCHEMA_DUMP);
    }
    required
}

fn unavailable_tool_message(ctx: &dyn FeatureContext, tool_name: &str) -> Option<String> {
    match tool_name {
        tool::SCHEMA_CHECK | tool::SCHEMA_DUMP if !ctx.sqlx_enabled() => Some(format!(
            "{tool_name} is not available because sqlx_enabled = false in .jig.toml. Enable SQLx and schema dumps, then run `jig update --recopy`, or remove this command/gate."
        )),
        tool::SCHEMA_CHECK | tool::SCHEMA_DUMP if !ctx.schema_dump_enabled() => Some(format!(
            "{tool_name} is not available because schema_dump_enabled = false in .jig.toml. Enable schema dumps, then run `jig update --recopy`, or remove this command/gate."
        )),
        tool::SQLX_CHECK | tool::MIGRATION_ADD if !ctx.sqlx_enabled() => Some(format!(
            "{tool_name} is not available because sqlx_enabled = false in .jig.toml. Enable SQLx, then run `jig update --recopy`, or remove this command/gate."
        )),
        _ => None,
    }
}