@@ -2,6 +2,7 @@ use std::ptr;
2
2
use std:: io:: Write ;
3
3
use JsonValue ;
4
4
use number:: Number ;
5
+ use std:: io;
5
6
6
7
use util:: print_dec;
7
8
@@ -42,19 +43,19 @@ pub trait Generator {
42
43
fn get_writer ( & mut self ) -> & mut Self :: T ;
43
44
44
45
#[ 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)
47
48
}
48
49
49
50
#[ 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] )
52
53
}
53
54
54
- fn write_min ( & mut self , slice : & [ u8 ] , min : u8 ) ;
55
+ fn write_min ( & mut self , slice : & [ u8 ] , min : u8 ) -> io :: Result < ( ) > ;
55
56
56
57
#[ inline( always) ]
57
- fn new_line ( & mut self ) { }
58
+ fn new_line ( & mut self ) -> io :: Result < ( ) > { Ok ( ( ) ) }
58
59
59
60
#[ inline( always) ]
60
61
fn indent ( & mut self ) { }
@@ -63,44 +64,43 @@ pub trait Generator {
63
64
fn dedent ( & mut self ) { }
64
65
65
66
#[ 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 ( ) ) ) ;
68
69
69
70
for ( index, ch) in string. bytes ( ) . enumerate ( ) . skip ( start) {
70
71
let escape = ESCAPED [ ch as usize ] ;
71
72
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] ) ) ;
74
75
start = index + 1 ;
75
76
}
76
77
if escape == b'u' {
77
- write ! ( self . get_writer( ) , "{:04x}" , ch) . unwrap ( ) ;
78
+ try! ( write ! ( self . get_writer( ) , "{:04x}" , ch) ) ;
78
79
}
79
80
}
80
- self . write ( string[ start ..] . as_bytes ( ) ) ;
81
+ try! ( self . write ( string[ start ..] . as_bytes ( ) ) ) ;
81
82
82
- self . write_char ( b'"' ) ;
83
+ self . write_char ( b'"' )
83
84
}
84
85
85
86
#[ 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'"' ) ) ;
88
89
89
90
for ( index, ch) in string. bytes ( ) . enumerate ( ) {
90
91
if ESCAPED [ ch as usize ] > 0 {
91
92
return self . write_string_complex ( string, index)
92
93
}
93
94
}
94
95
95
- self . write ( string. as_bytes ( ) ) ;
96
- self . write_char ( b'"' ) ;
96
+ try! ( self . write ( string. as_bytes ( ) ) ) ;
97
+ self . write_char ( b'"' )
97
98
}
98
99
99
100
#[ inline( always) ]
100
- fn write_number ( & mut self , num : & Number ) {
101
+ fn write_number ( & mut self , num : & Number ) -> io :: Result < ( ) > {
101
102
if num. is_nan ( ) {
102
- self . write ( b"null" ) ;
103
- return ;
103
+ return self . write ( b"null" ) ;
104
104
}
105
105
let ( positive, mantissa, exponent) = num. as_parts ( ) ;
106
106
unsafe {
@@ -109,11 +109,11 @@ pub trait Generator {
109
109
positive,
110
110
mantissa,
111
111
exponent
112
- ) . unwrap ( ) ;
112
+ )
113
113
}
114
114
}
115
115
116
- fn write_json ( & mut self , json : & JsonValue ) {
116
+ fn write_json ( & mut self , json : & JsonValue ) -> io :: Result < ( ) > {
117
117
match * json {
118
118
JsonValue :: Null => self . write ( b"null" ) ,
119
119
JsonValue :: Short ( ref short) => self . write_string ( short. as_str ( ) ) ,
@@ -122,54 +122,54 @@ pub trait Generator {
122
122
JsonValue :: Boolean ( true ) => self . write ( b"true" ) ,
123
123
JsonValue :: Boolean ( false ) => self . write ( b"false" ) ,
124
124
JsonValue :: Array ( ref array) => {
125
- self . write_char ( b'[' ) ;
125
+ try! ( self . write_char ( b'[' ) ) ;
126
126
let mut iter = array. iter ( ) ;
127
127
128
128
if let Some ( item) = iter. next ( ) {
129
129
self . indent ( ) ;
130
- self . new_line ( ) ;
131
- self . write_json ( item) ;
130
+ try! ( self . new_line ( ) ) ;
131
+ try! ( self . write_json ( item) ) ;
132
132
} else {
133
- self . write_char ( b']' ) ;
134
- return ;
133
+ try! ( self . write_char ( b']' ) ) ;
134
+ return Ok ( ( ) ) ;
135
135
}
136
136
137
137
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) ) ;
141
141
}
142
142
143
143
self . dedent ( ) ;
144
- self . new_line ( ) ;
145
- self . write_char ( b']' ) ;
144
+ try! ( self . new_line ( ) ) ;
145
+ self . write_char ( b']' )
146
146
} ,
147
147
JsonValue :: Object ( ref object) => {
148
- self . write_char ( b'{' ) ;
148
+ try! ( self . write_char ( b'{' ) ) ;
149
149
let mut iter = object. iter ( ) ;
150
150
151
151
if let Some ( ( key, value) ) = iter. next ( ) {
152
152
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) ) ;
157
157
} else {
158
- self . write_char ( b'}' ) ;
159
- return ;
158
+ try! ( self . write_char ( b'}' ) ) ;
159
+ return Ok ( ( ) ) ;
160
160
}
161
161
162
162
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) ) ;
168
168
}
169
169
170
170
self . dedent ( ) ;
171
- self . new_line ( ) ;
172
- self . write_char ( b'}' ) ;
171
+ try! ( self . new_line ( ) ) ;
172
+ self . write_char ( b'}' )
173
173
}
174
174
}
175
175
}
@@ -196,13 +196,15 @@ impl DumpGenerator {
196
196
impl Generator for DumpGenerator {
197
197
type T = Vec < u8 > ;
198
198
199
- fn write ( & mut self , slice : & [ u8 ] ) {
199
+ fn write ( & mut self , slice : & [ u8 ] ) -> io :: Result < ( ) > {
200
200
extend_from_slice ( & mut self . code , slice) ;
201
+ Ok ( ( ) )
201
202
}
202
203
203
204
#[ 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 ( ( ) )
206
208
}
207
209
208
210
#[ inline( always) ]
@@ -211,8 +213,9 @@ impl Generator for DumpGenerator {
211
213
}
212
214
213
215
#[ inline( always) ]
214
- fn write_min ( & mut self , _: & [ u8 ] , min : u8 ) {
216
+ fn write_min ( & mut self , _: & [ u8 ] , min : u8 ) -> io :: Result < ( ) > {
215
217
self . code . push ( min) ;
218
+ Ok ( ( ) )
216
219
}
217
220
}
218
221
@@ -240,13 +243,15 @@ impl Generator for PrettyGenerator {
240
243
type T = Vec < u8 > ;
241
244
242
245
#[ inline( always) ]
243
- fn write ( & mut self , slice : & [ u8 ] ) {
246
+ fn write ( & mut self , slice : & [ u8 ] ) -> io :: Result < ( ) > {
244
247
extend_from_slice ( & mut self . code , slice) ;
248
+ Ok ( ( ) )
245
249
}
246
250
247
251
#[ 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 ( ( ) )
250
255
}
251
256
252
257
#[ inline( always) ]
@@ -255,15 +260,17 @@ impl Generator for PrettyGenerator {
255
260
}
256
261
257
262
#[ 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 ( ( ) )
260
266
}
261
267
262
- fn new_line ( & mut self ) {
268
+ fn new_line ( & mut self ) -> io :: Result < ( ) > {
263
269
self . code . push ( b'\n' ) ;
264
270
for _ in 0 ..( self . dent * self . spaces_per_indent ) {
265
271
self . code . push ( b' ' ) ;
266
272
}
273
+ Ok ( ( ) )
267
274
}
268
275
269
276
fn indent ( & mut self ) {
@@ -296,8 +303,55 @@ impl<'a, W> Generator for WriterGenerator<'a, W> where W: Write {
296
303
}
297
304
298
305
#[ 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 ;
301
355
}
302
356
}
303
357
0 commit comments