Skip to main content

surrealdb_expr/expr/statements/
ifelse.rs

1use surrealdb_types::{SqlFormat, ToSql};
2
3use crate::expr::Expr;
4
5#[derive(Clone, Debug, Default, Eq, PartialEq, Hash)]
6pub struct IfelseStatement {
7	/// The first if condition followed by a body, followed by any number of
8	/// else if's
9	pub exprs: Vec<(Expr, Expr)>,
10	/// the final else body, if there is one
11	pub close: Option<Expr>,
12}
13
14impl IfelseStatement {
15	/// Check if we require a writeable transaction
16	pub fn read_only(&self) -> bool {
17		self.exprs.iter().all(|x| x.0.read_only() && x.1.read_only())
18			&& self.close.as_ref().map(|x| x.read_only()).unwrap_or(true)
19	}
20}
21
22impl ToSql for IfelseStatement {
23	fn fmt_sql(&self, f: &mut String, fmt: SqlFormat) {
24		let stmt: crate::sql::statements::ifelse::IfelseStatement = self.clone().into();
25		stmt.fmt_sql(f, fmt);
26	}
27}
28
29#[cfg(test)]
30#[allow(clippy::unwrap_used)]
31mod tests {
32	use super::*;
33	use crate::syn;
34
35	#[test]
36	fn format_pretty() {
37		let query = syn::expr("IF 1 { 1 } ELSE IF 2 { 2 }").unwrap();
38		assert_eq!(query.to_sql(), "IF 1 { 1 } ELSE IF 2 { 2 }");
39		// Single-statement blocks stay inline even in pretty mode
40		assert_eq!(query.to_sql_pretty(), "IF 1 { 1 } ELSE IF 2 { 2 }");
41	}
42}