1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use core::fmt::Display;
use {Fail, Compat, Context};
pub trait ResultExt<T, E> {
fn compat(self) -> Result<T, Compat<E>>;
fn context<D>(self, context: D) -> Result<T, Context<D>> where
D: Display + Send + Sync + 'static;
fn with_context<F, D>(self, f: F) -> Result<T, Context<D>> where
F: FnOnce(&E) -> D,
D: Display + Send + Sync + 'static;
}
impl<T, E> ResultExt<T, E> for Result<T, E> where
E: Fail,
{
fn compat(self) -> Result<T, Compat<E>> {
self.map_err(|err| err.compat())
}
fn context<D>(self, context: D) -> Result<T, Context<D>> where
D: Display + Send + Sync + 'static
{
self.map_err(|failure| failure.context(context))
}
fn with_context<F, D>(self, f: F) -> Result<T, Context<D>> where
F: FnOnce(&E) -> D,
D: Display + Send + Sync + 'static
{
self.map_err(|failure| {
let context = f(&failure);
failure.context(context)
})
}
}
with_std! {
use Error;
impl<T> ResultExt<T, Error> for Result<T, Error> {
fn compat(self) -> Result<T, Compat<Error>> {
self.map_err(|err| err.compat())
}
fn context<D>(self, context: D) -> Result<T, Context<D>> where
D: Display + Send + Sync + 'static
{
self.map_err(|failure| failure.context(context))
}
fn with_context<F, D>(self, f: F) -> Result<T, Context<D>> where
F: FnOnce(&Error) -> D,
D: Display + Send + Sync + 'static
{
self.map_err(|failure| {
let context = f(&failure);
failure.context(context)
})
}
}
}