@@ -618,6 +618,54 @@ impl<T:Decodable> Decodable for Option<T> {
618
618
}
619
619
}
620
620
621
+ impl < T1 : Encodable , T2 : Encodable > Encodable for Result < T1 , T2 > {
622
+ fn encode < S : Encoder > ( & self , s : & mut S ) -> Result < ( ) , S :: Error > {
623
+ s. emit_enum ( "Result" , |s| {
624
+ match * self {
625
+ Ok ( ref v) => {
626
+ s. emit_enum_variant ( "Ok" , 0 , 1 , |s| {
627
+ s. emit_enum_variant_arg ( 0 , |s| {
628
+ v. encode ( s)
629
+ } )
630
+ } )
631
+ }
632
+ Err ( ref v) => {
633
+ s. emit_enum_variant ( "Err" , 1 , 1 , |s| {
634
+ s. emit_enum_variant_arg ( 0 , |s| {
635
+ v. encode ( s)
636
+ } )
637
+ } )
638
+ }
639
+ }
640
+ } )
641
+ }
642
+ }
643
+
644
+ impl < T1 : Decodable , T2 : Decodable > Decodable for Result < T1 , T2 > {
645
+ fn decode < D : Decoder > ( d : & mut D ) -> Result < Result < T1 , T2 > , D :: Error > {
646
+ d. read_enum ( "Result" , |d| {
647
+ d. read_enum_variant ( & [ "Ok" , "Err" ] , |d, disr| {
648
+ match disr {
649
+ 0 => {
650
+ Ok ( Ok ( d. read_enum_variant_arg ( 0 , |d| {
651
+ T1 :: decode ( d)
652
+ } ) ?) )
653
+ }
654
+ 1 => {
655
+ Ok ( Err ( d. read_enum_variant_arg ( 0 , |d| {
656
+ T2 :: decode ( d)
657
+ } ) ?) )
658
+ }
659
+ _ => {
660
+ panic ! ( "Encountered invalid discriminant while \
661
+ decoding `Result`.") ;
662
+ }
663
+ }
664
+ } )
665
+ } )
666
+ }
667
+ }
668
+
621
669
macro_rules! peel {
622
670
( $name: ident, $( $other: ident, ) * ) => ( tuple! { $( $other, ) * } )
623
671
}
0 commit comments