use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct SqlExpression {
pub sql: String,
}
impl SqlExpression {
pub fn new(sql: impl Into<String>) -> Self {
Self { sql: sql.into() }
}
pub fn concat(parts: &[&str]) -> Self {
Self {
sql: format!("CONCAT({})", parts.join(", ")),
}
}
pub fn lower(column: &str) -> Self {
Self {
sql: format!("LOWER({})", column),
}
}
pub fn upper(column: &str) -> Self {
Self {
sql: format!("UPPER({})", column),
}
}
pub fn coalesce(column: &str, default: &str) -> Self {
Self {
sql: format!("COALESCE({}, {})", column, default),
}
}
}
pub trait Expression {
fn to_sql(&self) -> String;
}
impl Expression for SqlExpression {
fn to_sql(&self) -> String {
self.sql.clone()
}
}
impl Expression for String {
fn to_sql(&self) -> String {
self.clone()
}
}
impl Expression for &str {
fn to_sql(&self) -> String {
self.to_string()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_hybrid_expression_lower_unit() {
let expr = SqlExpression::lower("email");
assert_eq!(expr.sql, "LOWER(email)");
}
}