Skip to content
This repository was archived by the owner on Aug 16, 2021. It is now read-only.

Commit 8ff5024

Browse files
committed
Use Error::source not Error::cause in Rust versions that have it
1 parent 38f2324 commit 8ff5024

File tree

5 files changed

+49
-4
lines changed

5 files changed

+49
-4
lines changed

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ travis-ci = { repository = "rust-lang-nursery/error-chain" }
2121
[features]
2222
default = ["backtrace", "example_generated"]
2323
example_generated = []
24+
has_error_source = [] # Determined by build.rs
2425

2526
[dependencies]
2627
backtrace = { version = "0.3.3", optional = true }
28+
29+
[build-dependencies]
30+
version_check = "0.1.5"

build.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
extern crate version_check;
2+
3+
use version_check::{is_beta, is_min_date, is_min_version, is_nightly};
4+
5+
fn main() {
6+
// Switch on for versions that have Error::source
7+
// As introduced by https://github.com/rust-lang/rust/pull/53533
8+
if (is_beta().unwrap_or(false)
9+
&& is_min_version("1.33.0-beta.3")
10+
.unwrap_or((false, "".to_string())).0)
11+
|| (is_nightly().unwrap_or(false)
12+
&& is_min_date("2018-09-02")
13+
.unwrap_or((false, "".to_string())).0)
14+
|| is_min_version("1.30").unwrap_or((false, "".to_string())).0
15+
{
16+
println!("cargo:rustc-cfg=has_error_source");
17+
}
18+
}

src/error_chain.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,12 @@ macro_rules! impl_error_chain_processed {
188188
$(
189189
$(#[$meta_foreign_links])*
190190
$error_kind_name::$foreign_link_variant(ref foreign_err) => {
191-
foreign_err.cause()
191+
match () {
192+
#[cfg(not(has_error_source))]
193+
() => foreign_err.cause(),
194+
#[cfg(has_error_source)]
195+
() => foreign_err.source(),
196+
}
192197
}
193198
) *
194199
_ => None

src/lib.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,12 @@ impl<'a> Iterator for Iter<'a> {
570570
fn next<'b>(&'b mut self) -> Option<&'a error::Error> {
571571
match self.0.take() {
572572
Some(e) => {
573-
self.0 = e.cause();
573+
self.0 = match () {
574+
#[cfg(not(has_error_source))]
575+
() => e.cause(),
576+
#[cfg(has_error_source)]
577+
() => e.source(),
578+
};
574579
Some(e)
575580
}
576581
None => None,

tests/tests.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -342,21 +342,34 @@ mod foreign_link_test {
342342
}
343343

344344
#[test]
345+
#[cfg(not(has_error_source))]
345346
fn finds_cause() {
346347
let chained_error = try_foreign_error().err().unwrap();
347348
assert_eq!(format!("{}", ForeignErrorCause {}),
348349
format!("{}", ::std::error::Error::cause(&chained_error).unwrap()));
349350
}
350351

352+
#[test]
353+
#[cfg(has_error_source)]
354+
fn finds_source() {
355+
let chained_error = try_foreign_error().err().unwrap();
356+
assert!(::std::error::Error::source(&chained_error).is_none());
357+
}
358+
351359
#[test]
352360
fn iterates() {
353361
let chained_error = try_foreign_error().err().unwrap();
354362
let mut error_iter = chained_error.iter();
355363
assert!(!format!("{:?}", error_iter).is_empty());
356364
assert_eq!(format!("{}", ForeignError { cause: ForeignErrorCause {} }),
357365
format!("{}", error_iter.next().unwrap()));
358-
assert_eq!(format!("{}", ForeignErrorCause {}),
359-
format!("{}", error_iter.next().unwrap()));
366+
match () {
367+
#[cfg(not(has_error_source))]
368+
() => assert_eq!(format!("{}", ForeignErrorCause {}),
369+
format!("{}", error_iter.next().unwrap())),
370+
#[cfg(has_error_source)]
371+
() => assert!(error_iter.next().is_none()),
372+
};
360373
assert_eq!(format!("{:?}", None as Option<&::std::error::Error>),
361374
format!("{:?}", error_iter.next()));
362375
}

0 commit comments

Comments
 (0)