pgdiff 0.1.0

Postgresql schema diff tool
Documentation
#[test]
fn diff() -> Result<(), Box<dyn std::error::Error>> {
    let actual = load_diff()?;
    let expected = include_str!("diff.sql");

    if actual != expected {
        let diff = similar::TextDiff::from_lines(expected, &actual);

        for op in diff.ops() {
            for change in diff.iter_changes(op) {
                let (sign, style) = match change.tag() {
                    similar::ChangeTag::Delete => ("-", console::Style::new().red()),
                    similar::ChangeTag::Insert => ("+", console::Style::new().green()),
                    similar::ChangeTag::Equal => (" ", console::Style::new()),
                };
                print!("{}{}", style.apply_to(sign).bold(), style.apply_to(change));
            }
        }
        panic!();
    }

    Ok(())
}

#[test]
fn syntax() -> Result<(), Box<dyn std::error::Error>> {
    let diff = load_diff()?;

    let sql = format!("do $syntax_check$ begin return;{diff}end; $syntax_check$;");

    let url = std::env::var("NEW_URL").unwrap();
    let db = elephantry::Connection::new(&url)?;
    db.execute(&sql)?;

    Ok(())
}

fn load_diff() -> Result<String, Box<dyn std::error::Error>> {
    let old = db("OLD_URL", include_str!("old.sql"))?;
    let new = db("NEW_URL", include_str!("new.sql"))?;

    let pgdiff = pgdiff::diff::Diff::from(&old, &new);

    let diff = pgdiff.sql()?;

    Ok(diff)
}

fn db(env: &str, sql: &str) -> Result<pgdiff::inspect::Database, Box<dyn std::error::Error>> {
    let url = std::env::var(env).unwrap();
    let db = elephantry::Connection::new(&url)?;

    db.execute(&sql)?;

    let url = std::env::var(env).unwrap();
    let diff = pgdiff::inspect::Database::new(&url)?;

    Ok(diff)
}