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")]
69impl Expressive<crate::sqlite::types::AnySqliteType>
70 for Ternary<crate::sqlite::types::AnySqliteType>
71{
72 fn expr(&self) -> Expression<crate::sqlite::types::AnySqliteType> {
73 Expression::new("IIF({}, {}, {})", self.args())
74 }
75}
76
77#[cfg(feature = "mysql")]
80impl Expressive<crate::mysql::types::AnyMysqlType> for Ternary<crate::mysql::types::AnyMysqlType> {
81 fn expr(&self) -> Expression<crate::mysql::types::AnyMysqlType> {
82 Expression::new("IF({}, {}, {})", self.args())
83 }
84}
85
86#[cfg(feature = "postgres")]
89impl Expressive<crate::postgres::types::AnyPostgresType>
90 for Ternary<crate::postgres::types::AnyPostgresType>
91{
92 fn expr(&self) -> Expression<crate::postgres::types::AnyPostgresType> {
93 Expression::new("CASE WHEN {} THEN {} ELSE {} END", self.args())
94 }
95}