use regex::Regex;
use sqlparser::keywords::ALL_KEYWORDS;
pub trait Dialect {
fn identifier_quote_style(&self, _identifier: &str) -> Option<char>;
fn supports_nulls_first_in_sort(&self) -> bool {
true
}
}
pub struct DefaultDialect {}
impl Dialect for DefaultDialect {
fn identifier_quote_style(&self, identifier: &str) -> Option<char> {
let identifier_regex = Regex::new(r"^[a-zA-Z_][a-zA-Z0-9_]*$").unwrap();
if ALL_KEYWORDS.contains(&identifier.to_uppercase().as_str())
|| !identifier_regex.is_match(identifier)
{
Some('"')
} else {
None
}
}
}
pub struct PostgreSqlDialect {}
impl Dialect for PostgreSqlDialect {
fn identifier_quote_style(&self, _: &str) -> Option<char> {
Some('"')
}
}
pub struct MySqlDialect {}
impl Dialect for MySqlDialect {
fn identifier_quote_style(&self, _: &str) -> Option<char> {
Some('`')
}
fn supports_nulls_first_in_sort(&self) -> bool {
false
}
}
pub struct SqliteDialect {}
impl Dialect for SqliteDialect {
fn identifier_quote_style(&self, _: &str) -> Option<char> {
Some('`')
}
}
pub struct CustomDialect {
identifier_quote_style: Option<char>,
}
impl CustomDialect {
pub fn new(identifier_quote_style: Option<char>) -> Self {
Self {
identifier_quote_style,
}
}
}
impl Dialect for CustomDialect {
fn identifier_quote_style(&self, _: &str) -> Option<char> {
self.identifier_quote_style
}
}