cratestack_sql/
dialect.rs1use std::fmt::Write;
2
3pub trait Dialect {
15 fn write_placeholder(&self, sql: &mut String, index: usize);
18}
19
20#[derive(Debug, Clone, Copy, Default)]
22pub struct PostgresDialect;
23
24impl Dialect for PostgresDialect {
25 fn write_placeholder(&self, sql: &mut String, index: usize) {
26 let _ = write!(sql, "${index}");
27 }
28}
29
30#[derive(Debug, Clone, Copy, Default)]
32pub struct SqliteDialect;
33
34impl Dialect for SqliteDialect {
35 fn write_placeholder(&self, sql: &mut String, index: usize) {
36 let _ = write!(sql, "?{index}");
37 }
38}
39
40#[cfg(test)]
41mod tests {
42 use super::*;
43
44 #[test]
45 fn postgres_dialect_writes_dollar_placeholders() {
46 let dialect = PostgresDialect;
47 let mut sql = String::new();
48 dialect.write_placeholder(&mut sql, 1);
49 sql.push_str(", ");
50 dialect.write_placeholder(&mut sql, 2);
51 assert_eq!(sql, "$1, $2");
52 }
53
54 #[test]
55 fn sqlite_dialect_writes_question_placeholders() {
56 let dialect = SqliteDialect;
57 let mut sql = String::new();
58 dialect.write_placeholder(&mut sql, 1);
59 sql.push_str(", ");
60 dialect.write_placeholder(&mut sql, 2);
61 assert_eq!(sql, "?1, ?2");
62 }
63}