use std::{io, process};
use thiserror::Error;
#[derive(Debug, Error)]
pub enum Error {
#[error("could not find `postgres` binary")]
FindPostgres(which::Error),
#[error("could not find `initdb` binary")]
FindInitdb(which::Error),
#[error("could not find `pg_isready` binary")]
FindPgIsready(which::Error),
#[error("could not find `psql` binary")]
FindPsql(which::Error),
#[error("could not create temporary directory for database")]
CreateDatabaseDir(io::Error),
#[error("error writing temporary password")]
WriteTemporaryPw(io::Error),
#[error("failed to run `initdb`")]
RunInitDb(io::Error),
#[error("`initdb` exited with status {}", 0)]
InitDbFailed(process::ExitStatus),
#[error("failed to launch `postgres`")]
LaunchPostgres(io::Error),
#[error("postgres did not become ready in time")]
StartupTimeout,
#[error("failed to run `psql`")]
RunPsql(io::Error),
#[error("`psql` exited with status {}", 0)]
PsqlFailed(process::ExitStatus),
#[error("invalid PGDB_TESTS_URL")]
InvalidExternalUrl(#[source] ExternalUrlError),
}
#[derive(Debug, Error)]
pub enum ExternalUrlError {
#[error("invalid URL: {0}")]
ParseError(#[source] url::ParseError),
#[error("must use postgres:// scheme")]
InvalidScheme,
#[error("must include a host")]
MissingHost,
#[error("must include a username")]
MissingUsername,
}