pub(crate) trait Dialect: Send + Sync {
fn quote_ident(&self, ident: &str) -> String;
fn placeholder(&self, index: usize) -> String;
fn json_object(&self, pairs: &[(String, String)]) -> String;
fn json_array_agg(&self, element: &str) -> String;
}
pub(crate) fn sql_string_literal(s: &str) -> String {
format!("'{}'", s.replace('\'', "''"))
}
pub(crate) struct Sqlite;
impl Dialect for Sqlite {
fn quote_ident(&self, ident: &str) -> String {
format!("\"{}\"", ident.replace('"', "\"\""))
}
fn placeholder(&self, index: usize) -> String {
format!("?{index}")
}
fn json_object(&self, pairs: &[(String, String)]) -> String {
let args = pairs
.iter()
.map(|(key, value)| format!("{}, {value}", sql_string_literal(key)))
.collect::<Vec<_>>()
.join(", ");
format!("json_object({args})")
}
fn json_array_agg(&self, element: &str) -> String {
format!("json_group_array({element})")
}
}