@@ -663,6 +663,23 @@ macro_rules! quick_error {
663
663
) => {
664
664
} ;
665
665
// ----------------------------- CONTEXT IMPL --------------------------
666
+ ( FIND_CONTEXT_IMPL $name: ident $item: ident: TUPLE
667
+ [ $( $var: ident: $typ: ty ) ,* ]
668
+ { context( $cvar: ident: AsRef <$ctyp: ty>, $fvar: ident: $ftyp: ty)
669
+ -> ( $( $texpr: expr ) ,* ) $( $tail: tt ) * }
670
+ ) => {
671
+ impl <T : AsRef <$ctyp>> From <$crate:: Context <T , $ftyp>> for $name {
672
+ fn from(
673
+ $crate:: Context ( $cvar, $fvar) : $crate:: Context <T , $ftyp>)
674
+ -> $name
675
+ {
676
+ $name:: $item( $( $texpr ) ,* )
677
+ }
678
+ }
679
+ quick_error!( FIND_CONTEXT_IMPL
680
+ $name $item: TUPLE [ $( $var: $typ ) ,* ]
681
+ { $( $tail) * } ) ;
682
+ } ;
666
683
( FIND_CONTEXT_IMPL $name: ident $item: ident: TUPLE
667
684
[ $( $var: ident: $typ: ty ) ,* ]
668
685
{ context( $cvar: ident: $ctyp: ty, $fvar: ident: $ftyp: ty)
@@ -680,6 +697,25 @@ macro_rules! quick_error {
680
697
$name $item: TUPLE [ $( $var: $typ ) ,* ]
681
698
{ $( $tail) * } ) ;
682
699
} ;
700
+ ( FIND_CONTEXT_IMPL $name: ident $item: ident: STRUCT
701
+ [ $( $var: ident: $typ: ty ) ,* ]
702
+ { context( $cvar: ident: AsRef <$ctyp: ty>, $fvar: ident: $ftyp: ty)
703
+ -> { $( $tvar: ident: $texpr: expr ) ,* } $( $tail: tt ) * }
704
+ ) => {
705
+ impl <T : AsRef <$ctyp>> From <$crate:: Context <T , $ftyp>> for $name {
706
+ fn from(
707
+ $crate:: Context ( $cvar, $fvar) : $crate:: Context <$ctyp, $ftyp>)
708
+ -> $name
709
+ {
710
+ $name:: $item {
711
+ $( $tvar: $texpr ) ,*
712
+ }
713
+ }
714
+ }
715
+ quick_error!( FIND_CONTEXT_IMPL
716
+ $name $item: STRUCT [ $( $var: $typ ) ,* ]
717
+ { $( $tail) * } ) ;
718
+ } ;
683
719
( FIND_CONTEXT_IMPL $name: ident $item: ident: STRUCT
684
720
[ $( $var: ident: $typ: ty ) ,* ]
685
721
{ context( $cvar: ident: $ctyp: ty, $fvar: ident: $ftyp: ty)
@@ -797,6 +833,7 @@ mod test {
797
833
use std:: str:: Utf8Error ;
798
834
use std:: string:: FromUtf8Error ;
799
835
use std:: error:: Error ;
836
+ use std:: path:: { Path , PathBuf } ;
800
837
801
838
use super :: ResultExt ;
802
839
@@ -980,6 +1017,16 @@ mod test {
980
1017
-> { src: s. to_string( ) , err: e}
981
1018
display( "Int error {:?}: {}" , src, err)
982
1019
}
1020
+ Utf8 ( path: PathBuf , err: Utf8Error ) {
1021
+ context( p: AsRef <Path >, e: Utf8Error )
1022
+ -> ( p. as_ref( ) . to_path_buf( ) , e)
1023
+ display( "Path error at {:?}: {}" , path, err)
1024
+ }
1025
+ Utf8Str ( s: String , err: :: std:: io:: Error ) {
1026
+ context( s: AsRef <str >, e: :: std:: io:: Error )
1027
+ -> ( s. as_ref( ) . to_string( ) , e)
1028
+ display( "Str error {:?}: {}" , s, err)
1029
+ }
983
1030
}
984
1031
}
985
1032
@@ -1010,4 +1057,21 @@ mod test {
1010
1057
assert_eq ! ( format!( "{:?}" , "x" . parse:: <i32 >( ) . context( "x" ) ) ,
1011
1058
r#"Err(Context("x", ParseIntError { kind: InvalidDigit }))"# ) ;
1012
1059
}
1060
+
1061
+ #[ test]
1062
+ fn path_context ( ) {
1063
+ fn parse_utf < P : AsRef < Path > > ( s : & [ u8 ] , p : P )
1064
+ -> Result < ( ) , ContextErr >
1065
+ {
1066
+ try!( :: std:: str:: from_utf8 ( s) . context ( p) ) ;
1067
+ Ok ( ( ) )
1068
+ }
1069
+ assert_eq ! ( format!( "{}" , parse_utf( b"a\x80 \x80 " , "/etc" ) . unwrap_err( ) ) ,
1070
+ "Path error at \" /etc\" : invalid utf-8: \
1071
+ invalid byte near index 1") ;
1072
+ assert_eq ! ( format!( "{}" , parse_utf( b"\x80 \x80 " ,
1073
+ PathBuf :: from( "/tmp" ) ) . unwrap_err( ) ) ,
1074
+ "Path error at \" /tmp\" : invalid utf-8: \
1075
+ invalid byte near index 0") ;
1076
+ }
1013
1077
}
0 commit comments