mod element_gen;
mod scope_gen;
use crate::config::LineEnding;
use crate::error::TranspileError;
use std::io::Write;
pub struct LuaCodeGenerator<'a, W: Write> {
writer: &'a mut W,
indent_level: usize,
line_ending: LineEnding,
}
impl<'a, W: Write> LuaCodeGenerator<'a, W> {
pub fn new(writer: &'a mut W) -> Self {
Self {
writer,
indent_level: 0,
line_ending: LineEnding::default(),
}
}
pub fn with_line_ending(writer: &'a mut W, line_ending: LineEnding) -> Self {
Self {
writer,
indent_level: 0,
line_ending,
}
}
fn write_indent(&mut self) -> Result<(), TranspileError> {
let indent = " ".repeat(self.indent_level);
write!(self.writer, "{}", indent)?;
Ok(())
}
fn writeln(&mut self, s: &str) -> Result<(), TranspileError> {
self.write_indent()?;
write!(self.writer, "{}{}", s, self.line_ending.as_str())?;
Ok(())
}
fn write_blank_line(&mut self) -> Result<(), TranspileError> {
write!(self.writer, "{}", self.line_ending.as_str())?;
Ok(())
}
fn write_raw(&mut self, s: &str) -> Result<(), TranspileError> {
write!(self.writer, "{}", s)?;
Ok(())
}
fn indent(&mut self) {
self.indent_level += 1;
}
fn dedent(&mut self) {
if self.indent_level > 0 {
self.indent_level -= 1;
}
}
fn end_block(&mut self) -> Result<(), TranspileError> {
self.dedent();
self.writeln("end")?;
self.write_blank_line()?;
Ok(())
}
pub fn write_header(&mut self) -> Result<(), TranspileError> {
self.writeln("local PASTA = require \"pasta\"")?;
self.writeln("local GLOBAL = require \"pasta.global\"")?;
self.write_blank_line()?;
Ok(())
}
}