Skip to main content

code_gen/statement/
semi.rs

1use crate::{CodeBuffer, Expression, Literal, Statement};
2
3/// A semicolon ended expression statement.
4pub struct Semi<E: Expression> {
5    expression: E,
6}
7
8impl<E: Expression> From<E> for Semi<E> {
9    fn from(expression: E) -> Self {
10        Self { expression }
11    }
12}
13
14impl From<&str> for Semi<Literal> {
15    fn from(value: &str) -> Self {
16        Self::from(Literal::from(value))
17    }
18}
19
20impl From<String> for Semi<Literal> {
21    fn from(value: String) -> Self {
22        Self::from(Literal::from(value))
23    }
24}
25
26impl<E: Expression> Statement for Semi<E> {
27    fn write(&self, b: &mut CodeBuffer, level: usize) {
28        b.indent(level);
29        self.expression.write(b);
30        b.push(';');
31        b.end_line();
32    }
33}
34
35#[cfg(test)]
36mod tests {
37    use super::*;
38
39    #[test]
40    fn semi_from_str() {
41        let semi = Semi::from("let x = 1");
42        assert_eq!(semi.to_code(), "let x = 1;\n");
43    }
44
45    #[test]
46    fn semi_from_string() {
47        let semi = Semi::from(String::from("let x = 1"));
48        assert_eq!(semi.to_code(), "let x = 1;\n");
49    }
50
51    #[test]
52    fn semi_indented() {
53        let semi = Semi::from("x");
54        let mut b = CodeBuffer::default();
55        semi.write(&mut b, 2);
56        assert_eq!(b.peek(), "        x;\n");
57    }
58}