pub const BUILTINS: &[(&str, &str)] = &[
("del", "DELETE FROM $table$\nWHERE $condition$;\n"),
(
"ins",
"INSERT INTO $table$ ($columns$)\nVALUES ($values$);\n",
),
(
"join",
"SELECT $cols$\nFROM $left$ AS l\nINNER JOIN $right$ AS r ON l.$lkey$ = r.$rkey$\nWHERE $condition$;\n",
),
("sel", "SELECT $cols$\nFROM $table$\nWHERE $condition$;\n"),
(
"upd",
"UPDATE $table$\nSET $column$ = $value$\nWHERE $condition$;\n",
),
(
"with",
"WITH cte AS (\n SELECT $cols$ FROM $table$\n)\nSELECT * FROM cte;\n",
),
];
#[must_use]
pub fn lookup(name: &str) -> Option<&'static str> {
BUILTINS
.iter()
.find(|(n, _)| *n == name)
.map(|(_, body)| *body)
}
#[must_use]
pub fn list() -> Vec<&'static str> {
BUILTINS.iter().map(|(n, _)| *n).collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn select_template_known() {
assert!(lookup("sel").is_some());
assert!(lookup("sel").unwrap().contains("SELECT"));
assert!(lookup("sel").unwrap().contains("$cols$"));
}
#[test]
fn unknown_template_returns_none() {
assert!(lookup("nosuch").is_none());
}
#[test]
fn list_contains_known_names() {
let names = list();
assert!(names.contains(&"sel"));
assert!(names.contains(&"ins"));
assert!(names.contains(&"upd"));
assert!(names.contains(&"del"));
assert!(names.contains(&"join"));
assert!(names.contains(&"with"));
}
#[test]
fn placeholders_use_dollar_dollar_syntax() {
for (_, body) in BUILTINS {
let dollar_count = body.matches('$').count();
assert!(dollar_count > 0, "template should have placeholders");
assert_eq!(dollar_count % 2, 0, "unbalanced placeholders in: {body}");
}
}
}