1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use crate::{CodeBuffer, Statement};

/// An element with statements.
pub trait WithStatements {
    /// Gets the statements.
    fn statements(&self) -> &[Box<dyn Statement>];

    /// Adds the statement.
    fn with_statement<S>(self, statement: S) -> Self
    where
        S: 'static + Statement;

    /// Adds the statement.
    fn add_statement<S>(&mut self, statement: S)
    where
        S: 'static + Statement;

    /// Writes the statements.
    fn write_statements(&self, b: &mut CodeBuffer, level: usize) {
        for statement in self.statements() {
            statement.write(b, level);
        }
    }

    /// Writes the curly-bracket statement block.
    fn write_curly_statement_block(&self, b: &mut CodeBuffer, level: usize) {
        if self.statements().is_empty() {
            b.write("{}");
        } else {
            b.write("{");
            b.end_line();
            self.write_statements(b, level + 1);
            b.indent(level);
            b.write("}");
        }
    }
}