#[must_use]
pub fn quote_ident(value: &str) -> String {
let escaped = value.replace('"', "\"\"");
format!("\"{escaped}\"")
}
#[must_use]
pub fn quote_literal(value: &str) -> String {
let escaped = value.replace('\'', "''");
format!("'{escaped}'")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn identifiers_quote_empty_and_embedded_delimiters() {
assert_eq!(quote_ident(""), "\"\"");
assert_eq!(quote_ident("a\"b"), "\"a\"\"b\"");
}
#[test]
fn literals_quote_empty_and_embedded_delimiters() {
assert_eq!(quote_literal(""), "''");
assert_eq!(quote_literal("O'Reilly"), "'O''Reilly'");
}
#[test]
fn quoting_preserves_control_shaped_unicode_and_sql_punctuation() {
let value = "snow 雪;\n\t\u{0001}'\"--";
assert_eq!(quote_ident(value), "\"snow 雪;\n\t\u{0001}'\"\"--\"");
assert_eq!(quote_literal(value), "'snow 雪;\n\t\u{0001}''\"--'");
}
}