#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum DialectFamily {
PostgreSql,
TSql,
Snowflake,
SparkSql,
ClickHouse,
Razeri,
#[serde(rename = "mariadb")]
MariaDB,
BigQuery,
Redshift,
Custom(&'static str),
}
impl DialectFamily {
#[must_use]
pub const fn name(&self) -> &'static str {
match self {
Self::PostgreSql => "postgre_sql",
Self::TSql => "t_sql",
Self::Snowflake => "snowflake",
Self::SparkSql => "spark_sql",
Self::ClickHouse => "click_house",
Self::Razeri => "razeri",
Self::MariaDB => "mariadb",
Self::BigQuery => "big_query",
Self::Redshift => "redshift",
Self::Custom(name) => name,
}
}
#[must_use]
pub const fn quote_chars(&self) -> (&'static str, &'static str) {
match self {
Self::PostgreSql
| Self::Snowflake
| Self::Razeri
| Self::Redshift
| Self::Custom(_) => ("\"", "\""),
Self::TSql => ("[", "]"),
Self::SparkSql | Self::ClickHouse | Self::MariaDB | Self::BigQuery => ("`", "`"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_quote_chars() {
assert_eq!(DialectFamily::PostgreSql.quote_chars(), ("\"", "\""));
assert_eq!(DialectFamily::TSql.quote_chars(), ("[", "]"));
assert_eq!(DialectFamily::ClickHouse.quote_chars(), ("`", "`"));
}
#[test]
fn a_custom_family_carries_its_name_and_is_licensed_nothing() {
let mine = DialectFamily::Custom("teradata");
assert_eq!(mine.name(), "teradata");
assert_eq!(mine.quote_chars(), ("\"", "\""));
assert_ne!(mine, DialectFamily::PostgreSql);
}
#[test]
fn every_named_family_reports_its_serde_spelling() {
for (family, spelled) in [
(DialectFamily::PostgreSql, "postgre_sql"),
(DialectFamily::TSql, "t_sql"),
(DialectFamily::MariaDB, "mariadb"),
(DialectFamily::BigQuery, "big_query"),
(DialectFamily::Redshift, "redshift"),
] {
assert_eq!(family.name(), spelled);
assert_eq!(
serde_json::to_string(&family).expect("a family serializes"),
format!("\"{spelled}\"")
);
}
}
}