Skip to main content

ormdantic_dialects/
kind.rs

1use ormdantic_core::{OrmdanticError, OrmdanticResult};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
4pub enum DialectKind {
5    Sqlite,
6    Postgres,
7    MySql,
8    MariaDb,
9    MsSql,
10    Oracle,
11}
12
13impl DialectKind {
14    pub fn parse(name: &str) -> OrmdanticResult<Self> {
15        let normalized = normalize_dialect_name(name);
16        match normalized.as_str() {
17            "sqlite" | "sqlite3" | "aiosqlite" => Ok(Self::Sqlite),
18            "postgres" | "postgresql" | "asyncpg" | "psycopg" | "psycopg2" | "pg8000" => {
19                Ok(Self::Postgres)
20            }
21            "mysql" | "pymysql" | "mysqlconnector" | "aiomysql" | "asyncmy" => Ok(Self::MySql),
22            "mariadb" | "mariadbconnector" => Ok(Self::MariaDb),
23            "mssql" | "pyodbc" | "pymssql" | "aioodbc" => Ok(Self::MsSql),
24            "oracle" | "oracledb" | "cxoracle" => Ok(Self::Oracle),
25            other => Err(OrmdanticError::UnsupportedDialect {
26                dialect: other.to_string(),
27            }),
28        }
29    }
30}
31
32pub fn normalize_dialect_name(name_or_url: &str) -> String {
33    let lower = name_or_url.trim().to_ascii_lowercase();
34    let before_url = lower
35        .split_once("://")
36        .map_or(lower.as_str(), |(scheme, _)| scheme);
37    before_url
38        .split('+')
39        .next()
40        .unwrap_or(before_url)
41        .replace(['-', '_'], "")
42}