halo/
dialect.rs

1//! SQL 占位符方言支持。
2
3/// SQL 占位符风格。
4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
5pub enum Dialect {
6    /// 使用 `?` 作为占位符(常见于 MySQL/SQLite)。
7    QuestionMark,
8    /// 使用 `$1, $2, ...` 作为占位符(常见于 PostgreSQL)。
9    DollarNumbered,
10}
11
12impl Dialect {
13    #[allow(dead_code)]
14    pub(crate) fn write_placeholder(self, index_1_based: usize, out: &mut String) {
15        match self {
16            Self::QuestionMark => out.push('?'),
17            Self::DollarNumbered => {
18                out.push('$');
19                out.push_str(&index_1_based.to_string());
20            }
21        }
22    }
23}
24
25#[cfg(test)]
26mod tests {
27    use super::Dialect;
28
29    #[test]
30    fn write_placeholder_question_mark() {
31        let mut s = String::new();
32        Dialect::QuestionMark.write_placeholder(1, &mut s);
33        assert_eq!(s, "?");
34    }
35
36    #[test]
37    fn write_placeholder_dollar_numbered() {
38        let mut s = String::new();
39        Dialect::DollarNumbered.write_placeholder(12, &mut s);
40        assert_eq!(s, "$12");
41    }
42}