Skip to content

Commit 8a93f25

Browse files
authored
Merge pull request #132 from Yoric/print
Resolves #131 - Implement pretty and dump for Object
2 parents 2f3ecd5 + 2370dd2 commit 8a93f25

File tree

3 files changed

+52
-27
lines changed

3 files changed

+52
-27
lines changed

src/codegen.rs

+30-25
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::ptr;
22
use std::io::Write;
33
use JsonValue;
44
use number::Number;
5+
use object::Object;
56
use std::io;
67

78
use util::print_dec;
@@ -113,6 +114,34 @@ pub trait Generator {
113114
}
114115
}
115116

117+
fn write_object(&mut self, object: &Object) -> io::Result<()> {
118+
try!(self.write_char(b'{'));
119+
let mut iter = object.iter();
120+
121+
if let Some((key, value)) = iter.next() {
122+
self.indent();
123+
try!(self.new_line());
124+
try!(self.write_string(key));
125+
try!(self.write_min(b": ", b':'));
126+
try!(self.write_json(value));
127+
} else {
128+
try!(self.write_char(b'}'));
129+
return Ok(());
130+
}
131+
132+
for (key, value) in iter {
133+
try!(self.write_char(b','));
134+
try!(self.new_line());
135+
try!(self.write_string(key));
136+
try!(self.write_min(b": ", b':'));
137+
try!(self.write_json(value));
138+
}
139+
140+
self.dedent();
141+
try!(self.new_line());
142+
self.write_char(b'}')
143+
}
144+
116145
fn write_json(&mut self, json: &JsonValue) -> io::Result<()> {
117146
match *json {
118147
JsonValue::Null => self.write(b"null"),
@@ -145,31 +174,7 @@ pub trait Generator {
145174
self.write_char(b']')
146175
},
147176
JsonValue::Object(ref object) => {
148-
try!(self.write_char(b'{'));
149-
let mut iter = object.iter();
150-
151-
if let Some((key, value)) = iter.next() {
152-
self.indent();
153-
try!(self.new_line());
154-
try!(self.write_string(key));
155-
try!(self.write_min(b": ", b':'));
156-
try!(self.write_json(value));
157-
} else {
158-
try!(self.write_char(b'}'));
159-
return Ok(());
160-
}
161-
162-
for (key, value) in iter {
163-
try!(self.write_char(b','));
164-
try!(self.new_line());
165-
try!(self.write_string(key));
166-
try!(self.write_min(b": ", b':'));
167-
try!(self.write_json(value));
168-
}
169-
170-
self.dedent();
171-
try!(self.new_line());
172-
self.write_char(b'}')
177+
self.write_object(object)
173178
}
174179
}
175180
}

src/object.rs

+16
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use std::{ ptr, mem, str, slice, fmt };
22
use std::ops::{ Index, IndexMut, Deref };
33

4+
use codegen::{ DumpGenerator, Generator, PrettyGenerator };
45
use value::JsonValue;
56

67
const KEY_BUF_LEN: usize = 32;
@@ -490,6 +491,21 @@ impl Object {
490491
inner: self.store.iter_mut()
491492
}
492493
}
494+
495+
/// Prints out the value as JSON string.
496+
pub fn dump(&self) -> String {
497+
let mut gen = DumpGenerator::new();
498+
gen.write_object(self).expect("Can't fail");
499+
gen.consume()
500+
}
501+
502+
/// Pretty prints out the value as JSON string. Takes an argument that's
503+
/// number of spaces to indent new blocks with.
504+
pub fn pretty(&self, spaces: u16) -> String {
505+
let mut gen = PrettyGenerator::new(spaces);
506+
gen.write_object(self).expect("Can't fail");
507+
gen.consume()
508+
}
493509
}
494510

495511
// Custom implementation of `Clone`, as new heap allocation means

tests/stringify.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ fn stringify_object() {
144144
"age" => 30
145145
};
146146

147+
assert_eq!(object.dump(), r#"{"name":"Maciej","age":30}"#);
147148
assert_eq!(stringify(object), r#"{"name":"Maciej","age":30}"#);
148149
}
149150

@@ -154,6 +155,7 @@ fn stringify_raw_object() {
154155
object.insert("name", "Maciej".into());
155156
object.insert("age", 30.into());
156157

158+
assert_eq!(object.dump(), r#"{"name":"Maciej","age":30}"#);
157159
assert_eq!(stringify(object), r#"{"name":"Maciej","age":30}"#);
158160
}
159161

@@ -193,6 +195,7 @@ fn stringify_object_with_put() {
193195
object["a"] = 100.into();
194196
object["b"] = false.into();
195197

198+
assert_eq!(object.dump(), r#"{"a":100,"b":false}"#);
196199
assert_eq!(stringify(object), r#"{"a":100,"b":false}"#);
197200
}
198201

@@ -240,6 +243,7 @@ fn stringify_pretty_object() {
240243
"cars" => array![ "Golf", "Mercedes", "Porsche" ]
241244
};
242245

243-
assert_eq!(stringify_pretty(object, 2),
244-
"{\n \"name\": \"Urlich\",\n \"age\": 50,\n \"parents\": {\n \"mother\": \"Helga\",\n \"father\": \"Brutus\"\n },\n \"cars\": [\n \"Golf\",\n \"Mercedes\",\n \"Porsche\"\n ]\n}");
246+
let expected = "{\n \"name\": \"Urlich\",\n \"age\": 50,\n \"parents\": {\n \"mother\": \"Helga\",\n \"father\": \"Brutus\"\n },\n \"cars\": [\n \"Golf\",\n \"Mercedes\",\n \"Porsche\"\n ]\n}";
247+
assert_eq!(object.pretty(2), expected);
248+
assert_eq!(stringify_pretty(object, 2), expected);
245249
}

0 commit comments

Comments
 (0)