use crate::{ArgumentBuffer, SqlExpr, WriteSql};
pub fn cast<Sql, Arg, T>(
sql: &mut Sql,
expr: SqlExpr<'_, T>,
typ: &'_ str,
) -> Result<(), Arg::Error>
where
Sql: WriteSql<Arg>,
Arg: ArgumentBuffer<T>,
{
sql.push_cmd("CAST (");
sql.push_expr(expr)?;
sql.push_cmd(" AS ");
sql.push_cmd(typ);
sql.push_cmd(")");
Ok(())
}
#[macro_export]
macro_rules! static_cast {
($expr:literal AS $ty:literal) => {
concat!("CAST (", $expr, " AS ", $ty, ")")
};
}
pub use static_cast;
#[cfg(test)]
mod test {
#[test]
fn cast() {
assert_eq!(static_cast!("'-1'" AS "INTEGER"), "CAST ('-1' AS INTEGER)");
assert_eq!(
static_cast!("DATE::NOW()" AS "TIMESTAMP"),
"CAST (DATE::NOW() AS TIMESTAMP)"
);
assert_eq!(static_cast!("102" AS "TEXT"), "CAST (102 AS TEXT)");
}
}