Skip to content

Commit d7d01f9

Browse files
committed
Add AsRef<X> generic support for context (no other generics, though)
1 parent 935ed6b commit d7d01f9

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

src/lib.rs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,23 @@ macro_rules! quick_error {
663663
) => {
664664
};
665665
// ----------------------------- 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+
};
666683
(FIND_CONTEXT_IMPL $name:ident $item:ident: TUPLE
667684
[$( $var:ident: $typ:ty ),*]
668685
{ context($cvar:ident: $ctyp:ty, $fvar:ident: $ftyp:ty)
@@ -680,6 +697,25 @@ macro_rules! quick_error {
680697
$name $item: TUPLE [$( $var:$typ ),*]
681698
{ $($tail)* });
682699
};
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+
};
683719
(FIND_CONTEXT_IMPL $name:ident $item:ident: STRUCT
684720
[$( $var:ident: $typ:ty ),*]
685721
{ context($cvar:ident: $ctyp:ty, $fvar:ident: $ftyp:ty)
@@ -797,6 +833,7 @@ mod test {
797833
use std::str::Utf8Error;
798834
use std::string::FromUtf8Error;
799835
use std::error::Error;
836+
use std::path::{Path, PathBuf};
800837

801838
use super::ResultExt;
802839

@@ -980,6 +1017,16 @@ mod test {
9801017
-> {src: s.to_string(), err: e}
9811018
display("Int error {:?}: {}", src, err)
9821019
}
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+
}
9831030
}
9841031
}
9851032

@@ -1010,4 +1057,21 @@ mod test {
10101057
assert_eq!(format!("{:?}", "x".parse::<i32>().context("x")),
10111058
r#"Err(Context("x", ParseIntError { kind: InvalidDigit }))"#);
10121059
}
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+
}
10131077
}

0 commit comments

Comments
 (0)