Skip to content

Commit 3c20cc3

Browse files
committed
Add pretty printer to a T: Write, closes #89
1 parent 2f4d7bd commit 3c20cc3

File tree

3 files changed

+66
-6
lines changed

3 files changed

+66
-6
lines changed

src/codegen.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,53 @@ impl<'a, W> Generator for WriterGenerator<'a, W> where W: Write {
308308
}
309309
}
310310

311+
312+
pub struct PrettyWriterGenerator<'a, W: 'a + Write> {
313+
writer: &'a mut W,
314+
dent: u16,
315+
spaces_per_indent: u16,
316+
}
317+
318+
impl<'a, W> PrettyWriterGenerator<'a, W> where W: 'a + Write {
319+
pub fn new(writer: &'a mut W) -> Self {
320+
PrettyWriterGenerator {
321+
writer: writer,
322+
dent: 0,
323+
spaces_per_indent: 4,
324+
}
325+
}
326+
}
327+
328+
impl<'a, W> Generator for PrettyWriterGenerator<'a, W> where W: Write {
329+
type T = W;
330+
331+
#[inline(always)]
332+
fn get_writer(&mut self) -> &mut W {
333+
&mut self.writer
334+
}
335+
336+
#[inline(always)]
337+
fn write_min(&mut self, slice: &[u8], _: u8) -> io::Result<()> {
338+
self.writer.write_all(slice)
339+
}
340+
341+
fn new_line(&mut self) -> io::Result<()> {
342+
try!(self.write_char(b'\n'));
343+
for _ in 0..(self.dent * self.spaces_per_indent) {
344+
try!(self.write_char(b' '));
345+
}
346+
Ok(())
347+
}
348+
349+
fn indent(&mut self) {
350+
self.dent += 1;
351+
}
352+
353+
fn dedent(&mut self) {
354+
self.dent -= 1;
355+
}
356+
}
357+
311358
// From: https://github.com/dtolnay/fastwrite/blob/master/src/lib.rs#L68
312359
//
313360
// LLVM is not able to lower `Vec::extend_from_slice` into a memcpy, so this

src/value/mod.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use short::Short;
88
use number::Number;
99
use object::Object;
1010
use iterators::{ Members, MembersMut, Entries, EntriesMut };
11-
use codegen::{ Generator, PrettyGenerator, DumpGenerator, WriterGenerator };
11+
use codegen::{ Generator, PrettyGenerator, DumpGenerator, WriterGenerator, PrettyWriterGenerator };
1212

1313
mod implements;
1414

@@ -108,10 +108,10 @@ impl JsonValue {
108108
gen.write_json(self)
109109
}
110110

111-
// pub fn to_writer_pretty<W: Write>(&self, writer: &mut W) -> io::Error {
112-
// let mut gen = PrettyWriterGenerator::new(writer);
113-
// gen.write_json(self)
114-
// }
111+
pub fn to_writer_pretty<W: Write>(&self, writer: &mut W) -> io::Result<()> {
112+
let mut gen = PrettyWriterGenerator::new(writer);
113+
gen.write_json(self)
114+
}
115115

116116
pub fn is_string(&self) -> bool {
117117
match *self {

tests/value.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,20 @@ fn writer_generator() {
517517

518518
let mut buf = Vec::new();
519519

520-
data.to_writer(&mut buf);
520+
data.to_writer(&mut buf).expect("Can't fail with a Vec");
521521

522522
assert_eq!(String::from_utf8(buf).unwrap(), r#"{"foo":["bar",100,true]}"#);
523523
}
524+
525+
#[test]
526+
fn pretty_writer_generator() {
527+
let data = object!{
528+
"foo" => array!["bar", 100, true]
529+
};
530+
531+
let mut buf = Vec::new();
532+
533+
data.to_writer_pretty(&mut buf).expect("Can't fail with a Vec");
534+
535+
assert_eq!(String::from_utf8(buf).unwrap(), "{\n \"foo\": [\n \"bar\",\n 100,\n true\n ]\n}");
536+
}

0 commit comments

Comments
 (0)