ormdantic_dialects/
kind.rs1use 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}