sqlx_models_parser/dialect/
mod.rs1mod ansi;
14mod generic;
15mod hive;
16pub mod keywords;
17mod mssql;
18mod mysql;
19mod postgresql;
20mod snowflake;
21mod sqlite;
22
23use core::any::{Any, TypeId};
24use core::fmt::Debug;
25
26pub use self::ansi::AnsiDialect;
27pub use self::generic::GenericDialect;
28pub use self::hive::HiveDialect;
29pub use self::mssql::MsSqlDialect;
30pub use self::mysql::MySqlDialect;
31pub use self::postgresql::PostgreSqlDialect;
32pub use self::snowflake::SnowflakeDialect;
33pub use self::sqlite::SQLiteDialect;
34
35macro_rules! dialect_of {
38 ( $parsed_dialect: ident is $($dialect_type: ty)|+ ) => {
39 ($($parsed_dialect.dialect.is::<$dialect_type>())||+)
40 };
41}
42
43pub trait Dialect: Debug + Any {
44 fn is_delimited_identifier_start(&self, ch: char) -> bool {
50 ch == '"'
51 }
52 fn is_identifier_start(&self, ch: char) -> bool;
54 fn is_identifier_part(&self, ch: char) -> bool;
56}
57
58impl dyn Dialect {
59 #[inline]
60 pub fn is<T: Dialect>(&self) -> bool {
61 TypeId::of::<T>() == self.type_id()
63 }
64}
65
66#[cfg(test)]
67mod tests {
68 use super::ansi::AnsiDialect;
69 use super::generic::GenericDialect;
70 use super::*;
71
72 struct DialectHolder<'a> {
73 dialect: &'a dyn Dialect,
74 }
75
76 #[test]
77 fn test_is_dialect() {
78 let generic_dialect: &dyn Dialect = &GenericDialect {};
79 let ansi_dialect: &dyn Dialect = &AnsiDialect {};
80
81 let generic_holder = DialectHolder {
82 dialect: generic_dialect,
83 };
84 let ansi_holder = DialectHolder {
85 dialect: ansi_dialect,
86 };
87
88 assert!(dialect_of!(generic_holder is GenericDialect | AnsiDialect),);
89 assert!(!dialect_of!(generic_holder is AnsiDialect));
90
91 assert!(dialect_of!(ansi_holder is AnsiDialect));
92 assert!(dialect_of!(ansi_holder is GenericDialect | AnsiDialect),);
93 assert!(!dialect_of!(ansi_holder is GenericDialect | MsSqlDialect),);
94 }
95}