use std::fmt::Display;
#[derive(Debug, PartialEq, Eq)]
pub struct SanitizedIdentifier(String);
pub fn sanitize_sql_string(s: &str) -> String {
s.replace('"', "\"\"")
}
impl SanitizedIdentifier {
pub fn new(s: impl AsRef<str>) -> SanitizedIdentifier {
SanitizedIdentifier(format!("\"{}\"", sanitize_sql_string(s.as_ref())))
}
pub fn as_str(&self) -> &str {
&self.0
}
}
impl AsRef<str> for SanitizedIdentifier {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl Display for SanitizedIdentifier {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}
pub trait SqlSanitize {
type Sanitized;
fn to_sql_sanitized_string(&self) -> Self::Sanitized;
}
impl SqlSanitize for String {
type Sanitized = SanitizedIdentifier;
fn to_sql_sanitized_string(&self) -> Self::Sanitized {
SanitizedIdentifier::new(self)
}
}
impl SqlSanitize for &str {
type Sanitized = SanitizedIdentifier;
fn to_sql_sanitized_string(&self) -> Self::Sanitized {
SanitizedIdentifier::new(self)
}
}