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());
  }
}