#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Dialect {
Standard,
Sqlite,
Postgres,
MySql,
Mssql,
}
impl Dialect {
pub fn from_url(url: &str) -> Self {
let scheme = url
.trim_matches(|c: char| c <= ' ')
.split("://")
.next()
.unwrap_or("")
.split(':')
.next()
.unwrap_or("")
.to_ascii_lowercase();
match scheme.as_str() {
"postgres" | "postgresql" => Self::Postgres,
"mysql" | "mariadb" => Self::MySql,
"sqlite" => Self::Sqlite,
"mssql" | "sqlserver" => Self::Mssql,
_ => Self::Standard,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn from_url_recognizes_each_scheme() {
assert_eq!(
Dialect::from_url("postgres://localhost/db"),
Dialect::Postgres
);
assert_eq!(
Dialect::from_url("postgresql://localhost/db"),
Dialect::Postgres
);
assert_eq!(Dialect::from_url("mysql://localhost/db"), Dialect::MySql);
assert_eq!(Dialect::from_url("mariadb://localhost/db"), Dialect::MySql);
assert_eq!(Dialect::from_url("sqlite::memory:"), Dialect::Sqlite);
assert_eq!(Dialect::from_url("sqlite:app.db"), Dialect::Sqlite);
assert_eq!(Dialect::from_url("mssql://host:1433/db"), Dialect::Mssql);
assert_eq!(
Dialect::from_url("sqlserver://host:1433/db"),
Dialect::Mssql
);
assert_eq!(Dialect::from_url("postgres"), Dialect::Postgres);
}
#[test]
fn from_url_unknown_scheme_is_standard() {
assert_eq!(Dialect::from_url("oracle://host/db"), Dialect::Standard);
assert_eq!(Dialect::from_url(""), Dialect::Standard);
assert_eq!(Dialect::from_url("nonsense"), Dialect::Standard);
}
#[test]
fn from_url_is_case_insensitive() {
assert_eq!(
Dialect::from_url("POSTGRES://localhost/db"),
Dialect::Postgres
);
assert_eq!(Dialect::from_url("MySQL://localhost/db"), Dialect::MySql);
assert_eq!(Dialect::from_url("SQLite:app.db"), Dialect::Sqlite);
}
#[test]
fn from_url_tolerates_surrounding_whitespace() {
assert_eq!(Dialect::from_url(" postgres://host/db"), Dialect::Postgres);
assert_eq!(Dialect::from_url("\tmysql://host/db"), Dialect::MySql);
assert_eq!(Dialect::from_url("sqlite:app.db\n"), Dialect::Sqlite);
assert_eq!(Dialect::from_url("\0postgres://host/db"), Dialect::Postgres);
assert_eq!(Dialect::from_url("\u{1}mysql://host/db"), Dialect::MySql);
}
#[test]
fn from_url_handles_sqlite_without_authority() {
assert_eq!(
Dialect::from_url("sqlite:ecat-test.db?mode=memory"),
Dialect::Sqlite
);
}
}