microcad_lang/syntax/statement/
if_statement.rs

1// Copyright © 2025 The µcad authors <info@ucad.xyz>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4//! If statement syntax elements.
5
6use crate::{src_ref::*, syntax::*};
7
8/// If statement.
9#[derive(Clone, Debug)]
10pub struct IfStatement {
11    /// If condition.
12    pub cond: Expression,
13    /// Body if `true`.
14    pub body: Body,
15    /// Body if `false`.
16    pub body_else: Option<Body>,
17    /// Next if statement: `else if x == 1`.
18    pub next_if: Option<Box<IfStatement>>,
19    /// Source code reference.
20    pub src_ref: SrcRef,
21}
22
23impl SrcReferrer for IfStatement {
24    fn src_ref(&self) -> SrcRef {
25        self.src_ref.clone()
26    }
27}
28
29impl std::fmt::Display for IfStatement {
30    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
31        writeln!(f, "if {cond} {body}", cond = self.cond, body = self.body)?;
32        if let Some(body) = &self.body_else {
33            writeln!(f, "else {body}")?;
34        }
35        Ok(())
36    }
37}
38
39impl TreeDisplay for IfStatement {
40    fn tree_print(&self, f: &mut std::fmt::Formatter, mut depth: TreeState) -> std::fmt::Result {
41        writeln!(f, "{:depth$}IfStatement:", "")?;
42        depth.indent();
43        writeln!(f, "{:depth$}Condition:", "")?;
44        self.cond.tree_print(f, depth.indented())?;
45        writeln!(f, "{:depth$}If:", "")?;
46        self.body.tree_print(f, depth.indented())?;
47        if let Some(body_else) = &self.body_else {
48            writeln!(f, "{:depth$}Else:", "")?;
49            body_else.tree_print(f, depth.indented())?;
50        }
51        Ok(())
52    }
53}