mod common;
mod document;
mod types;
mod values;
use crate::ast::*;
use std::fmt::Write;
pub struct Writer {
indent_level: usize,
}
impl Writer {
pub fn new() -> Self {
Self { indent_level: 0 }
}
fn indent(&mut self) {
self.indent_level += 1;
}
fn dedent(&mut self) {
if self.indent_level > 0 {
self.indent_level -= 1;
}
}
fn write_indent(&mut self, output: &mut String) {
write!(output, "{:width$}", "", width = self.indent_level * 2).unwrap();
}
pub fn write(&mut self, doc: &Document) -> String {
let mut output = String::new();
for member in &doc.members {
match member {
DocumentMembers::Namespace(ns) => self.write_namespace(&mut output, ns),
DocumentMembers::Include(inc) => self.write_include(&mut output, inc),
DocumentMembers::Const(c) => self.write_const(&mut output, c),
DocumentMembers::Typedef(td) => self.write_typedef(&mut output, td),
DocumentMembers::Enum(e) => self.write_enum(&mut output, e),
DocumentMembers::Struct(s) => self.write_struct(&mut output, s),
DocumentMembers::Union(u) => self.write_union(&mut output, u),
DocumentMembers::Exception(e) => self.write_exception(&mut output, e),
DocumentMembers::Service(s) => self.write_service(&mut output, s),
}
writeln!(output).unwrap();
}
output
}
}