rustauth-cli 0.2.0

Command-line tools for RustAuth.
Documentation
use crate::app::AppError;
use crate::config::CliConfig;
use crate::db::{self, DbCliError};
use crate::telemetry;
use serde_json::Map;

pub(crate) async fn map_db_error(
    config: &CliConfig,
    command: &'static str,
    error: DbCliError,
) -> Result<(), AppError> {
    match &error {
        DbCliError::UnsupportedAdapter(adapter)
            if db::unsupported_adapter_exits_successfully(adapter) =>
        {
            eprintln!("{}", db::unsupported_adapter_guidance(adapter, command));
            telemetry::publish_cli_event_for_command(
                config,
                command,
                "unsupported_adapter",
                unsupported_adapter_payload(config),
            )
            .await;
            Err(AppError::SilentExit { code: 0 })
        }
        DbCliError::AdapterFeatureDisabled(_, _) => {
            telemetry::publish_cli_event_for_command(
                config,
                command,
                "unsupported_adapter",
                unsupported_adapter_payload(config),
            )
            .await;
            Err(error.into())
        }
        DbCliError::UnsupportedAdapter(_) => {
            telemetry::publish_cli_event_for_command(
                config,
                command,
                "unsupported_adapter",
                unsupported_adapter_payload(config),
            )
            .await;
            Err(error.into())
        }
        DbCliError::UnsupportedProvider(_) => {
            telemetry::publish_cli_event_for_command(
                config,
                command,
                "unsupported_database",
                unsupported_adapter_payload(config),
            )
            .await;
            Err(error.into())
        }
        _ => Err(error.into()),
    }
}

pub(crate) fn unsupported_adapter_payload(config: &CliConfig) -> Map<String, serde_json::Value> {
    let mut payload = Map::new();
    payload.insert(
        "adapter".to_owned(),
        serde_json::Value::String(config.database.adapter.clone()),
    );
    if let Some(provider) = &config.database.provider {
        payload.insert(
            "database".to_owned(),
            serde_json::Value::String(provider.clone()),
        );
    }
    payload
}

pub(crate) fn ensure_safe_to_apply(planned: &db::PlannedMigration) -> Result<(), AppError> {
    if planned.plan.warnings.is_empty() {
        return Ok(());
    }
    for warning in &planned.plan.warnings {
        eprintln!("WARNING: {warning:?}");
    }
    Err(DbCliError::UnsafeMigration.into())
}