@@ -2,6 +2,7 @@ use std::ptr;
22use std:: io:: Write ;
33use JsonValue ;
44use number:: Number ;
5+ use std:: io;
56
67use 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 {
196196impl 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