use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum DatabaseEngine {
PostgreSQL,
MySQL,
MariaDB,
SQLite,
}
impl DatabaseEngine {
pub fn detect_from_url(url: &str) -> Result<Self, String> {
if url.starts_with("postgres://") || url.starts_with("postgresql://") {
Ok(DatabaseEngine::PostgreSQL)
} else if url.starts_with("mysql://") {
Ok(DatabaseEngine::MySQL)
} else if url.starts_with("mariadb://") {
Ok(DatabaseEngine::MariaDB)
} else if url.starts_with("sqlite://") {
Ok(DatabaseEngine::SQLite)
} else {
Err(format!("Unsupported database URL: {}", url))
}
}
pub fn name(&self) -> &'static str {
match self {
DatabaseEngine::PostgreSQL => "PostgreSQL",
DatabaseEngine::MySQL => "MySQL",
DatabaseEngine::MariaDB => "MariaDB",
DatabaseEngine::SQLite => "SQLite",
}
}
}
pub(super) fn verify_database_driver(engine: &DatabaseEngine) -> Result<(), String> {
match engine {
#[cfg(not(feature = "postgres"))]
DatabaseEngine::PostgreSQL => Err(driver_not_enabled(engine, "postgres")),
#[cfg(not(feature = "mysql"))]
DatabaseEngine::MySQL => Err(driver_not_enabled(engine, "mysql")),
#[cfg(not(feature = "mysql"))]
DatabaseEngine::MariaDB => Err(driver_not_enabled(engine, "mariadb")),
#[cfg(not(feature = "sqlite"))]
DatabaseEngine::SQLite => Err(driver_not_enabled(engine, "sqlite")),
#[allow(unreachable_patterns)]
_ => Ok(()),
}
}
#[cfg(not(all(feature = "postgres", feature = "mysql", feature = "sqlite")))]
fn driver_not_enabled(engine: &DatabaseEngine, feature: &str) -> String {
crate::utils::trad::tf(
"build.driver_not_enabled",
&[
engine.name(),
feature,
env!("CARGO_PKG_VERSION"),
feature,
feature,
],
)
}
#[cfg(test)]
mod tests {
#[cfg(not(feature = "postgres"))]
#[test]
fn a_missing_driver_names_the_real_version_and_both_fixes() {
use super::*;
let msg = verify_database_driver(&DatabaseEngine::PostgreSQL).unwrap_err();
assert!(msg.contains(env!("CARGO_PKG_VERSION")), "{msg}");
assert!(msg.contains(r#"features = ["postgres"]"#), "{msg}");
assert!(
msg.contains("cargo install runique --features postgres --locked --force"),
"{msg}"
);
}
#[cfg(feature = "sqlite")]
#[test]
fn a_compiled_driver_passes() {
use super::*;
assert!(verify_database_driver(&DatabaseEngine::SQLite).is_ok());
}
}