intrepid-sqlite 0.3.0

Manage complex async business logic with ease
use std::{path::PathBuf, process::Command};

fn main() {
    let crate_dir = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap());
    let sqlx_offline = std::env::var("SQLX_OFFLINE");
    let out_dir = PathBuf::from(std::env::var("OUT_DIR").unwrap());

    let db_file = out_dir.join("schema.db");
    let db_url = format!("sqlite:{}", db_file.display());

    println!("cargo::rustc-env=DATABASE_URL={}", db_url,);

    if sqlx_offline.is_ok() {
        println!("cargo:warning=SQLX_OFFLINE is set, skipping database setup");
        return;
    }

    let migrations_dir = crate_dir.join("migrations");

    println!("cargo::rerun-if-changed={}", migrations_dir.display());

    if db_file.exists() {
        std::fs::remove_file(&db_file).unwrap();
    }

    std::fs::write(&db_file, b"").unwrap();

    let exit_status = Command::new("sqlx")
        .arg("migrate")
        .arg("run")
        .arg("--source")
        .arg(&migrations_dir)
        .arg("--database-url")
        .arg(&db_url)
        .spawn()
        .unwrap()
        .wait()
        .unwrap();

    if !exit_status.success() {
        panic!("sqlx failed: {exit_status}");
    }
}