1#![allow(deprecated)]
2
3use Delay;
4
5use futures::{Async, Future, Poll};
6
7use std::error;
8use std::fmt;
9use std::time::Instant;
10
11#[deprecated(since = "0.2.6", note = "use Timeout instead")]
12#[doc(hidden)]
13#[derive(Debug)]
14pub struct Deadline<T> {
15 future: T,
16 delay: Delay,
17}
18
19#[deprecated(since = "0.2.6", note = "use Timeout instead")]
20#[doc(hidden)]
21#[derive(Debug)]
22pub struct DeadlineError<T>(Kind<T>);
23
24#[derive(Debug)]
26enum Kind<T> {
27 Inner(T),
29
30 Elapsed,
32
33 Timer(::Error),
35}
36
37impl<T> Deadline<T> {
38 pub fn new(future: T, deadline: Instant) -> Deadline<T> {
41 Deadline::new_with_delay(future, Delay::new(deadline))
42 }
43
44 pub(crate) fn new_with_delay(future: T, delay: Delay) -> Deadline<T> {
45 Deadline { future, delay }
46 }
47
48 pub fn get_ref(&self) -> &T {
50 &self.future
51 }
52
53 pub fn get_mut(&mut self) -> &mut T {
55 &mut self.future
56 }
57
58 pub fn into_inner(self) -> T {
60 self.future
61 }
62}
63
64impl<T> Future for Deadline<T>
65where
66 T: Future,
67{
68 type Item = T::Item;
69 type Error = DeadlineError<T::Error>;
70
71 fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
72 match self.future.poll() {
74 Ok(Async::Ready(v)) => return Ok(Async::Ready(v)),
75 Ok(Async::NotReady) => {}
76 Err(e) => return Err(DeadlineError::inner(e)),
77 }
78
79 match self.delay.poll() {
81 Ok(Async::NotReady) => Ok(Async::NotReady),
82 Ok(Async::Ready(_)) => Err(DeadlineError::elapsed()),
83 Err(e) => Err(DeadlineError::timer(e)),
84 }
85 }
86}
87
88impl<T> DeadlineError<T> {
91 pub fn inner(err: T) -> DeadlineError<T> {
94 DeadlineError(Kind::Inner(err))
95 }
96
97 pub fn is_inner(&self) -> bool {
100 match self.0 {
101 Kind::Inner(_) => true,
102 _ => false,
103 }
104 }
105
106 pub fn into_inner(self) -> Option<T> {
108 match self.0 {
109 Kind::Inner(err) => Some(err),
110 _ => None,
111 }
112 }
113
114 pub fn elapsed() -> DeadlineError<T> {
117 DeadlineError(Kind::Elapsed)
118 }
119
120 pub fn is_elapsed(&self) -> bool {
123 match self.0 {
124 Kind::Elapsed => true,
125 _ => false,
126 }
127 }
128
129 pub fn timer(err: ::Error) -> DeadlineError<T> {
132 DeadlineError(Kind::Timer(err))
133 }
134
135 pub fn is_timer(&self) -> bool {
137 match self.0 {
138 Kind::Timer(_) => true,
139 _ => false,
140 }
141 }
142
143 pub fn into_timer(self) -> Option<::Error> {
145 match self.0 {
146 Kind::Timer(err) => Some(err),
147 _ => None,
148 }
149 }
150}
151
152impl<T: error::Error> error::Error for DeadlineError<T> {
153 fn description(&self) -> &str {
154 use self::Kind::*;
155
156 match self.0 {
157 Inner(ref e) => e.description(),
158 Elapsed => "deadline has elapsed",
159 Timer(ref e) => e.description(),
160 }
161 }
162}
163
164impl<T: fmt::Display> fmt::Display for DeadlineError<T> {
165 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
166 use self::Kind::*;
167
168 match self.0 {
169 Inner(ref e) => e.fmt(fmt),
170 Elapsed => "deadline has elapsed".fmt(fmt),
171 Timer(ref e) => e.fmt(fmt),
172 }
173 }
174}