@@ -267,6 +267,12 @@ pub enum DecoderError {
267
267
ApplicationError ( string:: String )
268
268
}
269
269
270
+ #[ deriving( Clone , PartialEq , Show ) ]
271
+ pub enum EncoderError {
272
+ IoError ( io:: IoError ) ,
273
+ BadHashmapKey
274
+ }
275
+
270
276
/// Returns a readable error string for a given error code.
271
277
pub fn error_str ( error : ErrorCode ) -> & ' static str {
272
278
match error {
@@ -302,7 +308,7 @@ pub fn decode<T: ::Decodable<Decoder, DecoderError>>(s: &str) -> DecodeResult<T>
302
308
}
303
309
304
310
/// Shortcut function to encode a `T` into a JSON `String`
305
- pub fn encode < ' a , T : Encodable < Encoder < ' a > , io :: IoError > > ( object : & T ) -> string:: String {
311
+ pub fn encode < ' a , T : Encodable < Encoder < ' a > , EncoderError > > ( object : & T ) -> string:: String {
306
312
let buff = Encoder :: buffer_encode ( object) ;
307
313
string:: String :: from_utf8 ( buff) . unwrap ( )
308
314
}
@@ -322,10 +328,19 @@ impl std::error::Error for DecoderError {
322
328
fn detail ( & self ) -> Option < std:: string:: String > { Some ( self . to_string ( ) ) }
323
329
}
324
330
325
- pub type EncodeResult = io:: IoResult < ( ) > ;
331
+ impl std:: error:: Error for EncoderError {
332
+ fn description ( & self ) -> & str { "encoder error" }
333
+ fn detail ( & self ) -> Option < std:: string:: String > { Some ( self . to_string ( ) ) }
334
+ }
335
+
336
+ impl std:: error:: FromError < io:: IoError > for EncoderError {
337
+ fn from_error ( err : io:: IoError ) -> EncoderError { EncoderError :: IoError ( err) }
338
+ }
339
+
340
+ pub type EncodeResult = Result < ( ) , EncoderError > ;
326
341
pub type DecodeResult < T > = Result < T , DecoderError > ;
327
342
328
- pub fn escape_bytes ( wr : & mut io:: Writer , bytes : & [ u8 ] ) -> Result < ( ) , io :: IoError > {
343
+ pub fn escape_bytes ( wr : & mut io:: Writer , bytes : & [ u8 ] ) -> EncodeResult {
329
344
try!( wr. write_str ( "\" " ) ) ;
330
345
331
346
let mut start = 0 ;
@@ -383,20 +398,21 @@ pub fn escape_bytes(wr: &mut io::Writer, bytes: &[u8]) -> Result<(), io::IoError
383
398
try!( wr. write ( bytes[ start..] ) ) ;
384
399
}
385
400
386
- wr. write_str ( "\" " )
401
+ try!( wr. write_str ( "\" " ) ) ;
402
+ Ok ( ( ) )
387
403
}
388
404
389
- fn escape_str ( writer : & mut io:: Writer , v : & str ) -> Result < ( ) , io :: IoError > {
405
+ fn escape_str ( writer : & mut io:: Writer , v : & str ) -> EncodeResult {
390
406
escape_bytes ( writer, v. as_bytes ( ) )
391
407
}
392
408
393
- fn escape_char ( writer : & mut io:: Writer , v : char ) -> Result < ( ) , io :: IoError > {
409
+ fn escape_char ( writer : & mut io:: Writer , v : char ) -> EncodeResult {
394
410
let mut buf = [ 0 , .. 4 ] ;
395
411
let len = v. encode_utf8 ( & mut buf) . unwrap ( ) ;
396
412
escape_bytes ( writer, buf[ mut ..len] )
397
413
}
398
414
399
- fn spaces ( wr : & mut io:: Writer , mut n : uint ) -> Result < ( ) , io :: IoError > {
415
+ fn spaces ( wr : & mut io:: Writer , mut n : uint ) -> EncodeResult {
400
416
const LEN : uint = 16 ;
401
417
static BUF : [ u8 , ..LEN ] = [ b' ' , ..LEN ] ;
402
418
@@ -406,10 +422,9 @@ fn spaces(wr: &mut io::Writer, mut n: uint) -> Result<(), io::IoError> {
406
422
}
407
423
408
424
if n > 0 {
409
- wr. write ( BUF [ ..n] )
410
- } else {
411
- Ok ( ( ) )
425
+ try!( wr. write ( BUF [ ..n] ) ) ;
412
426
}
427
+ Ok ( ( ) )
413
428
}
414
429
415
430
fn fmt_number_or_null ( v : f64 ) -> string:: String {
@@ -441,7 +456,7 @@ impl<'a> Encoder<'a> {
441
456
}
442
457
443
458
/// Encode the specified struct into a json [u8]
444
- pub fn buffer_encode < T : Encodable < Encoder < ' a > , io :: IoError > > ( object : & T ) -> Vec < u8 > {
459
+ pub fn buffer_encode < T : Encodable < Encoder < ' a > , EncoderError > > ( object : & T ) -> Vec < u8 > {
445
460
//Serialize the object in a string using a writer
446
461
let mut m = Vec :: new ( ) ;
447
462
// FIXME(14302) remove the transmute and unsafe block.
@@ -458,15 +473,17 @@ macro_rules! emit_enquoted_if_mapkey {
458
473
( $enc: ident, $e: expr) => {
459
474
if $enc. emitting_map_key == EmittingMapKeyState :: Emitting {
460
475
$enc. emitting_map_key = EmittingMapKeyState :: EmittedValidMapKey ;
461
- write!( $enc. writer, "\" {}\" " , $e)
476
+ try!( write!( $enc. writer, "\" {}\" " , $e) ) ;
477
+ Ok ( ( ) )
462
478
} else {
463
- write!( $enc. writer, "{}" , $e)
479
+ try!( write!( $enc. writer, "{}" , $e) ) ;
480
+ Ok ( ( ) )
464
481
}
465
482
}
466
483
}
467
484
468
- impl < ' a > :: Encoder < io :: IoError > for Encoder < ' a > {
469
- fn emit_nil ( & mut self ) -> EncodeResult { write ! ( self . writer, "null" ) }
485
+ impl < ' a > :: Encoder < EncoderError > for Encoder < ' a > {
486
+ fn emit_nil ( & mut self ) -> EncodeResult { try! ( write ! ( self . writer, "null" ) ) ; Ok ( ( ) ) }
470
487
471
488
fn emit_uint ( & mut self , v : uint ) -> EncodeResult { emit_enquoted_if_mapkey ! ( self , v) }
472
489
fn emit_u64 ( & mut self , v : u64 ) -> EncodeResult { emit_enquoted_if_mapkey ! ( self , v) }
@@ -482,10 +499,11 @@ impl<'a> ::Encoder<io::IoError> for Encoder<'a> {
482
499
483
500
fn emit_bool ( & mut self , v : bool ) -> EncodeResult {
484
501
if v {
485
- write ! ( self . writer, "true" )
502
+ try! ( write ! ( self . writer, "true" ) ) ;
486
503
} else {
487
- write ! ( self . writer, "false" )
504
+ try! ( write ! ( self . writer, "false" ) ) ;
488
505
}
506
+ Ok ( ( ) )
489
507
}
490
508
491
509
fn emit_f64 ( & mut self , v : f64 ) -> EncodeResult {
@@ -527,7 +545,8 @@ impl<'a> ::Encoder<io::IoError> for Encoder<'a> {
527
545
try!( escape_str ( self . writer , name) ) ;
528
546
try!( write ! ( self . writer, ",\" fields\" :[" ) ) ;
529
547
try!( f ( self ) ) ;
530
- write ! ( self . writer, "]}}" )
548
+ try!( write ! ( self . writer, "]}}" ) ) ;
549
+ Ok ( ( ) )
531
550
}
532
551
}
533
552
@@ -564,7 +583,8 @@ impl<'a> ::Encoder<io::IoError> for Encoder<'a> {
564
583
{
565
584
try!( write ! ( self . writer, "{{" ) ) ;
566
585
try!( f ( self ) ) ;
567
- write ! ( self . writer, "}}" )
586
+ try!( write ! ( self . writer, "}}" ) ) ;
587
+ Ok ( ( ) )
568
588
}
569
589
570
590
fn emit_struct_field < F > ( & mut self , name : & str , idx : uint , f : F ) -> EncodeResult where
@@ -615,7 +635,8 @@ impl<'a> ::Encoder<io::IoError> for Encoder<'a> {
615
635
{
616
636
try!( write ! ( self . writer, "[" ) ) ;
617
637
try!( f ( self ) ) ;
618
- write ! ( self . writer, "]" )
638
+ try!( write ! ( self . writer, "]" ) ) ;
639
+ Ok ( ( ) )
619
640
}
620
641
621
642
fn emit_seq_elt < F > ( & mut self , idx : uint , f : F ) -> EncodeResult where
@@ -632,7 +653,8 @@ impl<'a> ::Encoder<io::IoError> for Encoder<'a> {
632
653
{
633
654
try!( write ! ( self . writer, "{{" ) ) ;
634
655
try!( f ( self ) ) ;
635
- write ! ( self . writer, "}}" )
656
+ try!( write ! ( self . writer, "}}" ) ) ;
657
+ Ok ( ( ) )
636
658
}
637
659
638
660
fn emit_map_elt_key < F > ( & mut self , idx : uint , f : F ) -> EncodeResult where
@@ -643,10 +665,10 @@ impl<'a> ::Encoder<io::IoError> for Encoder<'a> {
643
665
try!( f ( self ) ) ;
644
666
if self . emitting_map_key == EmittingMapKeyState :: EmittedValidMapKey {
645
667
self . emitting_map_key = EmittingMapKeyState :: NotEmitting ;
668
+ Ok ( ( ) )
646
669
} else {
647
- panic ! ( "did not emit a valid map key, aborting encoding" ) ;
670
+ Err ( EncoderError :: BadHashmapKey )
648
671
}
649
- Ok ( ( ) )
650
672
}
651
673
652
674
fn emit_map_elt_val < F > ( & mut self , _idx : uint , f : F ) -> EncodeResult where
@@ -687,8 +709,8 @@ impl<'a> PrettyEncoder<'a> {
687
709
}
688
710
}
689
711
690
- impl < ' a > :: Encoder < io :: IoError > for PrettyEncoder < ' a > {
691
- fn emit_nil ( & mut self ) -> EncodeResult { write ! ( self . writer, "null" ) }
712
+ impl < ' a > :: Encoder < EncoderError > for PrettyEncoder < ' a > {
713
+ fn emit_nil ( & mut self ) -> EncodeResult { try! ( write ! ( self . writer, "null" ) ) ; Ok ( ( ) ) }
692
714
693
715
fn emit_uint ( & mut self , v : uint ) -> EncodeResult { emit_enquoted_if_mapkey ! ( self , v) }
694
716
fn emit_u64 ( & mut self , v : u64 ) -> EncodeResult { emit_enquoted_if_mapkey ! ( self , v) }
@@ -704,10 +726,11 @@ impl<'a> ::Encoder<io::IoError> for PrettyEncoder<'a> {
704
726
705
727
fn emit_bool ( & mut self , v : bool ) -> EncodeResult {
706
728
if v {
707
- write ! ( self . writer, "true" )
729
+ try! ( write ! ( self . writer, "true" ) ) ;
708
730
} else {
709
- write ! ( self . writer, "false" )
731
+ try! ( write ! ( self . writer, "false" ) ) ;
710
732
}
733
+ Ok ( ( ) )
711
734
}
712
735
713
736
fn emit_f64 ( & mut self , v : f64 ) -> EncodeResult {
@@ -759,7 +782,8 @@ impl<'a> ::Encoder<io::IoError> for PrettyEncoder<'a> {
759
782
self . curr_indent -= self . indent ;
760
783
try!( write ! ( self . writer, "]\n " ) ) ;
761
784
try!( spaces ( self . writer , self . curr_indent ) ) ;
762
- write ! ( self . writer, "}}" )
785
+ try!( write ! ( self . writer, "}}" ) ) ;
786
+ Ok ( ( ) )
763
787
}
764
788
}
765
789
@@ -797,16 +821,17 @@ impl<'a> ::Encoder<io::IoError> for PrettyEncoder<'a> {
797
821
F : FnOnce ( & mut PrettyEncoder < ' a > ) -> EncodeResult ,
798
822
{
799
823
if len == 0 {
800
- write ! ( self . writer, "{{}}" )
824
+ try! ( write ! ( self . writer, "{{}}" ) ) ;
801
825
} else {
802
826
try!( write ! ( self . writer, "{{" ) ) ;
803
827
self . curr_indent += self . indent ;
804
828
try!( f ( self ) ) ;
805
829
self . curr_indent -= self . indent ;
806
830
try!( write ! ( self . writer, "\n " ) ) ;
807
831
try!( spaces ( self . writer , self . curr_indent ) ) ;
808
- write ! ( self . writer, "}}" )
832
+ try! ( write ! ( self . writer, "}}" ) ) ;
809
833
}
834
+ Ok ( ( ) )
810
835
}
811
836
812
837
fn emit_struct_field < F > ( & mut self , name : & str , idx : uint , f : F ) -> EncodeResult where
@@ -861,16 +886,17 @@ impl<'a> ::Encoder<io::IoError> for PrettyEncoder<'a> {
861
886
F : FnOnce ( & mut PrettyEncoder < ' a > ) -> EncodeResult ,
862
887
{
863
888
if len == 0 {
864
- write ! ( self . writer, "[]" )
889
+ try! ( write ! ( self . writer, "[]" ) ) ;
865
890
} else {
866
891
try!( write ! ( self . writer, "[" ) ) ;
867
892
self . curr_indent += self . indent ;
868
893
try!( f ( self ) ) ;
869
894
self . curr_indent -= self . indent ;
870
895
try!( write ! ( self . writer, "\n " ) ) ;
871
896
try!( spaces ( self . writer , self . curr_indent ) ) ;
872
- write ! ( self . writer, "]" )
897
+ try! ( write ! ( self . writer, "]" ) ) ;
873
898
}
899
+ Ok ( ( ) )
874
900
}
875
901
876
902
fn emit_seq_elt < F > ( & mut self , idx : uint , f : F ) -> EncodeResult where
@@ -889,16 +915,17 @@ impl<'a> ::Encoder<io::IoError> for PrettyEncoder<'a> {
889
915
F : FnOnce ( & mut PrettyEncoder < ' a > ) -> EncodeResult ,
890
916
{
891
917
if len == 0 {
892
- write ! ( self . writer, "{{}}" )
918
+ try! ( write ! ( self . writer, "{{}}" ) ) ;
893
919
} else {
894
920
try!( write ! ( self . writer, "{{" ) ) ;
895
921
self . curr_indent += self . indent ;
896
922
try!( f ( self ) ) ;
897
923
self . curr_indent -= self . indent ;
898
924
try!( write ! ( self . writer, "\n " ) ) ;
899
925
try!( spaces ( self . writer , self . curr_indent ) ) ;
900
- write ! ( self . writer, "}}" )
926
+ try! ( write ! ( self . writer, "}}" ) ) ;
901
927
}
928
+ Ok ( ( ) )
902
929
}
903
930
904
931
fn emit_map_elt_key < F > ( & mut self , idx : uint , f : F ) -> EncodeResult where
@@ -914,10 +941,10 @@ impl<'a> ::Encoder<io::IoError> for PrettyEncoder<'a> {
914
941
try!( f ( self ) ) ;
915
942
if self . emitting_map_key == EmittingMapKeyState :: EmittedValidMapKey {
916
943
self . emitting_map_key = EmittingMapKeyState :: NotEmitting ;
944
+ Ok ( ( ) )
917
945
} else {
918
- panic ! ( "did not emit a valid map key, aborting encoding" ) ;
946
+ Err ( EncoderError :: BadHashmapKey )
919
947
}
920
- Ok ( ( ) )
921
948
}
922
949
923
950
fn emit_map_elt_val < F > ( & mut self , _idx : uint , f : F ) -> EncodeResult where
0 commit comments