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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#![allow(missing_docs)]
use std::fmt::{self, Display};
use std::error::Error;
use futures::{Async, Future, Poll};
use response::{Responder, Response};
macro_rules! define_either {
($name:ident <$( $variant:ident ),*>) => {
#[derive(Debug)]
pub enum $name<$( $variant ),*> {
$(
$variant($variant),
)*
}
impl<$( $variant ),*> Display for $name<$( $variant ),*>
where
$( $variant: Display ),*
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
$(
$name :: $variant (ref e) =>
write!(f,
concat!(stringify!($name), "::", stringify!($variant),
"({})"),
e),
)*
}
}
}
impl<$( $variant ),*> Error for $name<$( $variant ),*>
where
$( $variant: Error ),*
{
fn description(&self) -> &str {
match *self {
$(
$name :: $variant (ref e) => e.description(),
)*
}
}
}
impl<$( $variant ),*> Future for $name<$( $variant ),*>
where
$( $variant: Future ),*
{
type Item = $name <$( $variant :: Item ),*>;
type Error = $name <$( $variant :: Error ),*>;
fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
match *self {
$(
$name :: $variant(ref mut e) => {
let item = try_ready!(e.poll().map_err($name :: $variant));
Ok(Async::Ready($name :: $variant (item)))
},
)*
}
}
}
impl<$( $variant ),*> Responder for $name<$( $variant ),*>
where
$( $variant: Responder ),*
{
type Error = $name <$( $variant :: Error ),*>;
fn respond(self) -> Result<Response, Self::Error> {
match self {
$(
$name :: $variant (e) => e.respond().map_err($name :: $variant),
)*
}
}
}
}
}
define_either!(Either2<E1, E2>);
define_either!(Either3<E1, E2, E3>);
define_either!(Either4<E1, E2, E3, E4>);
define_either!(Either5<E1, E2, E3, E4, E5>);
define_either!(Either6<E1, E2, E3, E4, E5, E6>);
define_either!(Either7<E1, E2, E3, E4, E5, E6, E7>);