pub trait Render {
fn render(&self) -> String;
}
pub fn emit<R: Render, P: AsRef<std::path::Path>>(
path: P,
value: &R,
) -> std::io::Result<()> {
std::fs::write(path, value.render())
}
impl Render for crate::toml_ast::Document {
fn render(&self) -> String {
crate::toml_ast::Document::render(self)
}
}
impl Render for crate::json_ast::Value {
fn render(&self) -> String {
crate::json_ast::render(self)
}
}
impl Render for crate::yaml_ast::Value {
fn render(&self) -> String {
crate::yaml_ast::render(self)
}
}
impl Render for crate::xml_ast::Element {
fn render(&self) -> String {
crate::xml_ast::render_document(self)
}
}
impl Render for crate::sexp_ast::Forms {
fn render(&self) -> String {
crate::sexp_ast::render_forms(&self.0)
}
}
impl Render for crate::lined_ast::Lines {
fn render(&self) -> String {
crate::lined_ast::render(&self.0)
}
}
impl Render for crate::control_ast::Document {
fn render(&self) -> String {
crate::control_ast::render(&self.lines, self.indent_width)
}
}
impl Render for crate::ruby_ast::Block {
fn render(&self) -> String {
crate::ruby_ast::Block::render(self)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn render_trait_is_uniform_across_families() {
fn assert_renders<R: Render>(_r: &R) {}
assert_renders(&crate::json_ast::Value::obj());
assert_renders(&crate::yaml_ast::Value::map());
assert_renders(&crate::xml_ast::Element::new("x"));
assert_renders(&crate::toml_ast::Document::new());
assert_renders(&crate::sexp_ast::Forms(vec![]));
assert_renders(&crate::lined_ast::Lines(vec![]));
assert_renders(&crate::control_ast::Document::new(2));
}
}