@@ -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,8 @@ 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] )
301
308
}
302
309
}
303
310
0 commit comments