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::xml_ast::ElementNoDecl {
fn render(&self) -> String {
crate::xml_ast::ElementNoDecl::render(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)
}
}
impl Render for crate::kotlin_ast::File {
fn render(&self) -> String {
crate::kotlin_ast::File::render(self)
}
}
impl Render for crate::cmake_ast::File {
fn render(&self) -> String {
crate::cmake_ast::File::render(self)
}
}
impl Render for crate::swift_ast::File {
fn render(&self) -> String {
crate::swift_ast::File::render(self)
}
}
impl Render for crate::scala_ast::File {
fn render(&self) -> String {
crate::scala_ast::File::render(self)
}
}
impl Render for crate::lua_ast::File {
fn render(&self) -> String { crate::lua_ast::File::render(self) }
}
impl Render for crate::meson_ast::File {
fn render(&self) -> String { crate::meson_ast::File::render(self) }
}
impl Render for crate::zig_ast::File {
fn render(&self) -> String { crate::zig_ast::File::render(self) }
}
impl Render for crate::python_ast::File {
fn render(&self) -> String { crate::python_ast::File::render(self) }
}
impl Render for crate::elixir_ast::Module {
fn render(&self) -> String { crate::elixir_ast::Module::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));
assert_renders(&crate::ruby_ast::Block::new("X", "x"));
assert_renders(&crate::kotlin_ast::File::new());
assert_renders(&crate::swift_ast::File::new());
assert_renders(&crate::scala_ast::File::new());
assert_renders(&crate::lua_ast::File::new());
assert_renders(&crate::meson_ast::File::new());
assert_renders(&crate::zig_ast::File::new());
assert_renders(&crate::python_ast::File::new());
assert_renders(&crate::elixir_ast::Module::new("X"));
}
}