use crate::ast::{Condition, Expr};
pub fn case_when(condition: Condition, then_expr: impl Into<Expr>) -> CaseBuilder {
CaseBuilder {
when_clauses: vec![(condition, Box::new(then_expr.into()))],
else_value: None,
alias: None,
}
}
#[derive(Debug, Clone)]
pub struct CaseBuilder {
pub(crate) when_clauses: Vec<(Condition, Box<Expr>)>,
pub(crate) else_value: Option<Box<Expr>>,
pub(crate) alias: Option<String>,
}
impl CaseBuilder {
pub fn when(mut self, condition: Condition, then_expr: impl Into<Expr>) -> Self {
self.when_clauses
.push((condition, Box::new(then_expr.into())));
self
}
pub fn otherwise(mut self, else_expr: impl Into<Expr>) -> Self {
self.else_value = Some(Box::new(else_expr.into()));
self
}
pub fn alias(mut self, name: &str) -> Expr {
self.alias = Some(name.to_string());
self.build()
}
pub fn build(self) -> Expr {
Expr::Case {
when_clauses: self.when_clauses,
else_value: self.else_value,
alias: self.alias,
}
}
}
impl From<CaseBuilder> for Expr {
fn from(builder: CaseBuilder) -> Self {
builder.build()
}
}