code_gen/rust/control/
if_statement.rs

1use crate::{CodeBuffer, Expression, Literal, Source, Statement, WithStatements};
2
3/// An `if` statement with an optional `else` clause.
4pub struct IfStatement {
5    condition: Box<dyn Expression>,
6    success_statements: Source,
7    else_statements: Source,
8}
9
10impl<E: 'static + Expression> From<E> for IfStatement {
11    fn from(expression: E) -> Self {
12        Self {
13            condition: Box::new(expression),
14            success_statements: Source::default(),
15            else_statements: Source::default(),
16        }
17    }
18}
19
20impl From<&str> for IfStatement {
21    fn from(literal: &str) -> Self {
22        Self::from(Literal::from(literal))
23    }
24}
25
26impl From<String> for IfStatement {
27    fn from(literal: String) -> Self {
28        Self::from(Literal::from(literal))
29    }
30}
31
32impl IfStatement {
33    //! Success
34
35    /// Gets the success statements.
36    pub fn success_statements(&self) -> &Source {
37        &self.success_statements
38    }
39
40    /// Sets the `success` statements.
41    pub fn set_success_statements<S>(&mut self, success: S)
42    where
43        S: Into<Source>,
44    {
45        self.success_statements = success.into();
46    }
47
48    /// Sets the `success` statements.
49    pub fn with_success_statements<S>(mut self, success: S) -> Self
50    where
51        S: Into<Source>,
52    {
53        self.set_success_statements(success);
54        self
55    }
56}
57
58impl IfStatement {
59    //! Else
60
61    /// Gets the else statements.
62    pub fn else_statements(&self) -> &Source {
63        &self.else_statements
64    }
65
66    /// Sets the `else_statements`.
67    pub fn set_else_statements<S>(&mut self, else_statements: S)
68    where
69        S: Into<Source>,
70    {
71        self.else_statements = else_statements.into();
72    }
73
74    /// Sets the `else_statements`.
75    pub fn with_else_statements<S>(mut self, else_statements: S) -> Self
76    where
77        S: Into<Source>,
78    {
79        self.set_else_statements(else_statements);
80        self
81    }
82}
83
84impl Statement for IfStatement {
85    fn write(&self, b: &mut CodeBuffer, level: usize) {
86        b.indent(level);
87        b.write("if ");
88        self.condition.write(b);
89        b.write(" {");
90        b.end_line();
91        self.success_statements.write(b, level + 1);
92        if !self.else_statements.statements().is_empty() {
93            b.indent(level);
94            b.write("} else {");
95            b.end_line();
96            self.else_statements.write(b, level + 1);
97        }
98        b.line(level, "}");
99    }
100}