vantage_sql/primitives/
ternary.rs1use std::fmt::{Debug, Display};
2
3use vantage_expressions::{Expression, Expressive, ExpressiveEnum};
4
5#[derive(Debug, Clone)]
29pub struct Ternary<T: Debug + Display + Clone> {
30 condition: Expression<T>,
31 true_val: Expression<T>,
32 false_val: Expression<T>,
33}
34
35impl<T: Debug + Display + Clone> Ternary<T> {
36 pub fn new(
37 condition: impl Expressive<T>,
38 true_val: impl Expressive<T>,
39 false_val: impl Expressive<T>,
40 ) -> Self {
41 Self {
42 condition: condition.expr(),
43 true_val: true_val.expr(),
44 false_val: false_val.expr(),
45 }
46 }
47
48 fn args(&self) -> Vec<ExpressiveEnum<T>> {
49 vec![
50 ExpressiveEnum::Nested(self.condition.clone()),
51 ExpressiveEnum::Nested(self.true_val.clone()),
52 ExpressiveEnum::Nested(self.false_val.clone()),
53 ]
54 }
55}
56
57pub fn ternary<T: Debug + Display + Clone>(
59 condition: impl Expressive<T>,
60 true_val: impl Expressive<T>,
61 false_val: impl Expressive<T>,
62) -> Ternary<T> {
63 Ternary::new(condition, true_val, false_val)
64}
65
66#[cfg(feature = "sqlite")]
67impl Expressive<crate::sqlite::types::AnySqliteType>
68 for Ternary<crate::sqlite::types::AnySqliteType>
69{
70 fn expr(&self) -> Expression<crate::sqlite::types::AnySqliteType> {
71 Expression::new("IIF({}, {}, {})", self.args())
72 }
73}
74
75#[cfg(feature = "mysql")]
76impl Expressive<crate::mysql::types::AnyMysqlType> for Ternary<crate::mysql::types::AnyMysqlType> {
77 fn expr(&self) -> Expression<crate::mysql::types::AnyMysqlType> {
78 Expression::new("IF({}, {}, {})", self.args())
79 }
80}
81
82#[cfg(feature = "postgres")]
83impl Expressive<crate::postgres::types::AnyPostgresType>
84 for Ternary<crate::postgres::types::AnyPostgresType>
85{
86 fn expr(&self) -> Expression<crate::postgres::types::AnyPostgresType> {
87 Expression::new("CASE WHEN {} THEN {} ELSE {} END", self.args())
88 }
89}