Skip to content

Commit 16000ea

Browse files
authored
Merge pull request #91 from maciejhirsz/0.10.2
0.10.2 Closes #86, #88, #89
2 parents 0b6091d + fc4491b commit 16000ea

File tree

4 files changed

+159
-71
lines changed

4 files changed

+159
-71
lines changed

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "json"
3-
version = "0.10.1"
3+
version = "0.10.2"
44
authors = ["Maciej Hirsz <[email protected]>"]
55
description = "JSON implementation in Rust"
66
repository = "https://github.com/maciejhirsz/json-rust"

src/codegen.rs

+112-58
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 std::io;
56

67
use util::print_dec;
78

@@ -42,19 +43,19 @@ pub trait Generator {
4243
fn get_writer(&mut self) -> &mut Self::T;
4344

4445
#[inline(always)]
45-
fn write(&mut self, slice: &[u8]) {
46-
self.get_writer().write_all(slice).unwrap();
46+
fn write(&mut self, slice: &[u8]) -> io::Result<()> {
47+
self.get_writer().write_all(slice)
4748
}
4849

4950
#[inline(always)]
50-
fn write_char(&mut self, ch: u8) {
51-
self.get_writer().write_all(&[ch]).unwrap();
51+
fn write_char(&mut self, ch: u8) -> io::Result<()> {
52+
self.get_writer().write_all(&[ch])
5253
}
5354

54-
fn write_min(&mut self, slice: &[u8], min: u8);
55+
fn write_min(&mut self, slice: &[u8], min: u8) -> io::Result<()>;
5556

5657
#[inline(always)]
57-
fn new_line(&mut self) {}
58+
fn new_line(&mut self) -> io::Result<()> { Ok(()) }
5859

5960
#[inline(always)]
6061
fn indent(&mut self) {}
@@ -63,44 +64,43 @@ pub trait Generator {
6364
fn dedent(&mut self) {}
6465

6566
#[inline(never)]
66-
fn write_string_complex(&mut self, string: &str, mut start: usize) {
67-
self.write(string[ .. start].as_bytes());
67+
fn write_string_complex(&mut self, string: &str, mut start: usize) -> io::Result<()> {
68+
try!(self.write(string[ .. start].as_bytes()));
6869

6970
for (index, ch) in string.bytes().enumerate().skip(start) {
7071
let escape = ESCAPED[ch as usize];
7172
if escape > 0 {
72-
self.write(string[start .. index].as_bytes());
73-
self.write(&[b'\\', escape]);
73+
try!(self.write(string[start .. index].as_bytes()));
74+
try!(self.write(&[b'\\', escape]));
7475
start = index + 1;
7576
}
7677
if escape == b'u' {
77-
write!(self.get_writer(), "{:04x}", ch).unwrap();
78+
try!(write!(self.get_writer(), "{:04x}", ch));
7879
}
7980
}
80-
self.write(string[start ..].as_bytes());
81+
try!(self.write(string[start ..].as_bytes()));
8182

82-
self.write_char(b'"');
83+
self.write_char(b'"')
8384
}
8485

8586
#[inline(always)]
86-
fn write_string(&mut self, string: &str) {
87-
self.write_char(b'"');
87+
fn write_string(&mut self, string: &str) -> io::Result<()> {
88+
try!(self.write_char(b'"'));
8889

8990
for (index, ch) in string.bytes().enumerate() {
9091
if ESCAPED[ch as usize] > 0 {
9192
return self.write_string_complex(string, index)
9293
}
9394
}
9495

95-
self.write(string.as_bytes());
96-
self.write_char(b'"');
96+
try!(self.write(string.as_bytes()));
97+
self.write_char(b'"')
9798
}
9899

99100
#[inline(always)]
100-
fn write_number(&mut self, num: &Number) {
101+
fn write_number(&mut self, num: &Number) -> io::Result<()> {
101102
if num.is_nan() {
102-
self.write(b"null");
103-
return;
103+
return self.write(b"null");
104104
}
105105
let (positive, mantissa, exponent) = num.as_parts();
106106
unsafe {
@@ -109,11 +109,11 @@ pub trait Generator {
109109
positive,
110110
mantissa,
111111
exponent
112-
).unwrap();
112+
)
113113
}
114114
}
115115

116-
fn write_json(&mut self, json: &JsonValue) {
116+
fn write_json(&mut self, json: &JsonValue) -> io::Result<()> {
117117
match *json {
118118
JsonValue::Null => self.write(b"null"),
119119
JsonValue::Short(ref short) => self.write_string(short.as_str()),
@@ -122,54 +122,54 @@ pub trait Generator {
122122
JsonValue::Boolean(true) => self.write(b"true"),
123123
JsonValue::Boolean(false) => self.write(b"false"),
124124
JsonValue::Array(ref array) => {
125-
self.write_char(b'[');
125+
try!(self.write_char(b'['));
126126
let mut iter = array.iter();
127127

128128
if let Some(item) = iter.next() {
129129
self.indent();
130-
self.new_line();
131-
self.write_json(item);
130+
try!(self.new_line());
131+
try!(self.write_json(item));
132132
} else {
133-
self.write_char(b']');
134-
return;
133+
try!(self.write_char(b']'));
134+
return Ok(());
135135
}
136136

137137
for item in iter {
138-
self.write_char(b',');
139-
self.new_line();
140-
self.write_json(item);
138+
try!(self.write_char(b','));
139+
try!(self.new_line());
140+
try!(self.write_json(item));
141141
}
142142

143143
self.dedent();
144-
self.new_line();
145-
self.write_char(b']');
144+
try!(self.new_line());
145+
self.write_char(b']')
146146
},
147147
JsonValue::Object(ref object) => {
148-
self.write_char(b'{');
148+
try!(self.write_char(b'{'));
149149
let mut iter = object.iter();
150150

151151
if let Some((key, value)) = iter.next() {
152152
self.indent();
153-
self.new_line();
154-
self.write_string(key);
155-
self.write_min(b": ", b':');
156-
self.write_json(value);
153+
try!(self.new_line());
154+
try!(self.write_string(key));
155+
try!(self.write_min(b": ", b':'));
156+
try!(self.write_json(value));
157157
} else {
158-
self.write_char(b'}');
159-
return;
158+
try!(self.write_char(b'}'));
159+
return Ok(());
160160
}
161161

162162
for (key, value) in iter {
163-
self.write_char(b',');
164-
self.new_line();
165-
self.write_string(key);
166-
self.write_min(b": ", b':');
167-
self.write_json(value);
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));
168168
}
169169

170170
self.dedent();
171-
self.new_line();
172-
self.write_char(b'}');
171+
try!(self.new_line());
172+
self.write_char(b'}')
173173
}
174174
}
175175
}
@@ -196,13 +196,15 @@ impl DumpGenerator {
196196
impl Generator for DumpGenerator {
197197
type T = Vec<u8>;
198198

199-
fn write(&mut self, slice: &[u8]) {
199+
fn write(&mut self, slice: &[u8]) -> io::Result<()> {
200200
extend_from_slice(&mut self.code, slice);
201+
Ok(())
201202
}
202203

203204
#[inline(always)]
204-
fn write_char(&mut self, ch: u8) {
205-
self.code.push(ch)
205+
fn write_char(&mut self, ch: u8) -> io::Result<()> {
206+
self.code.push(ch);
207+
Ok(())
206208
}
207209

208210
#[inline(always)]
@@ -211,8 +213,9 @@ impl Generator for DumpGenerator {
211213
}
212214

213215
#[inline(always)]
214-
fn write_min(&mut self, _: &[u8], min: u8) {
216+
fn write_min(&mut self, _: &[u8], min: u8) -> io::Result<()> {
215217
self.code.push(min);
218+
Ok(())
216219
}
217220
}
218221

@@ -240,13 +243,15 @@ impl Generator for PrettyGenerator {
240243
type T = Vec<u8>;
241244

242245
#[inline(always)]
243-
fn write(&mut self, slice: &[u8]) {
246+
fn write(&mut self, slice: &[u8]) -> io::Result<()> {
244247
extend_from_slice(&mut self.code, slice);
248+
Ok(())
245249
}
246250

247251
#[inline(always)]
248-
fn write_char(&mut self, ch: u8) {
249-
self.code.push(ch)
252+
fn write_char(&mut self, ch: u8) -> io::Result<()> {
253+
self.code.push(ch);
254+
Ok(())
250255
}
251256

252257
#[inline(always)]
@@ -255,15 +260,17 @@ impl Generator for PrettyGenerator {
255260
}
256261

257262
#[inline(always)]
258-
fn write_min(&mut self, slice: &[u8], _: u8) {
259-
self.code.extend_from_slice(slice);
263+
fn write_min(&mut self, slice: &[u8], _: u8) -> io::Result<()> {
264+
extend_from_slice(&mut self.code, slice);
265+
Ok(())
260266
}
261267

262-
fn new_line(&mut self) {
268+
fn new_line(&mut self) -> io::Result<()> {
263269
self.code.push(b'\n');
264270
for _ in 0..(self.dent * self.spaces_per_indent) {
265271
self.code.push(b' ');
266272
}
273+
Ok(())
267274
}
268275

269276
fn indent(&mut self) {
@@ -296,8 +303,55 @@ impl<'a, W> Generator for WriterGenerator<'a, W> where W: Write {
296303
}
297304

298305
#[inline(always)]
299-
fn write_min(&mut self, _: &[u8], min: u8) {
300-
self.writer.write_all(&[min]).unwrap();
306+
fn write_min(&mut self, _: &[u8], min: u8) -> io::Result<()> {
307+
self.writer.write_all(&[min])
308+
}
309+
}
310+
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, spaces: u16) -> Self {
320+
PrettyWriterGenerator {
321+
writer: writer,
322+
dent: 0,
323+
spaces_per_indent: spaces,
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;
301355
}
302356
}
303357

0 commit comments

Comments
 (0)