code_gen/rust/control/
if_statement.rs1use crate::{CodeBuffer, Expression, Literal, Source, Statement, WithStatements};
2
3pub 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 pub fn success_statements(&self) -> &Source {
37 &self.success_statements
38 }
39
40 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 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 pub fn else_statements(&self) -> &Source {
63 &self.else_statements
64 }
65
66 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 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}