1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
use crate::value::Value; use std::io; use std::io::Write; pub struct Printer<'a, W: Write> { pub output: &'a mut W, } impl<'a, W: Write> Printer<'a, W> { fn print_sub_value(&mut self, x: Value) -> io::Result<()> { match x { Value::Splice(idx) => return write!(self.output, "splice {} ", idx), Value::Prim(prim) => return write!(self.output, "{} {} ", prim.type_str(), prim), Value::Record { head, props } => { if let Err(err) = write!(self.output, "{} {} ", head, props.len()) { return Err(err); } for prop in props { if let Err(err) = self.print_sub_value(prop) { return Err(err); } } return Ok(()); } } } fn print_newline(&mut self) -> io::Result<()> { return write!(self.output, "\n"); } pub fn print_value(&mut self, x: Value) -> io::Result<()> { return self.print_sub_value(x).and_then(|()| self.print_newline()); } }