mirror of
https://github.com/fafhrd91/actix-web
synced 2024-11-24 08:22:59 +01:00
add impl Future for Reply
This commit is contained in:
parent
8d65468c58
commit
a1958deaae
@ -1,8 +1,10 @@
|
|||||||
use futures::future::{err, ok, Future};
|
|
||||||
use futures::Poll;
|
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
|
use std::mem;
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
|
|
||||||
|
use futures::future::{err, ok, Future};
|
||||||
|
use futures::{Async, Poll};
|
||||||
|
|
||||||
use error::Error;
|
use error::Error;
|
||||||
use httprequest::HttpRequest;
|
use httprequest::HttpRequest;
|
||||||
use httpresponse::HttpResponse;
|
use httpresponse::HttpResponse;
|
||||||
@ -185,7 +187,31 @@ where
|
|||||||
/// * Future<T, Error> - reply process completes in the future
|
/// * Future<T, Error> - reply process completes in the future
|
||||||
pub struct Reply<T>(ReplyItem<T>);
|
pub struct Reply<T>(ReplyItem<T>);
|
||||||
|
|
||||||
|
impl<T> Future for Reply<T> {
|
||||||
|
type Item = T;
|
||||||
|
type Error = Error;
|
||||||
|
|
||||||
|
fn poll(&mut self) -> Poll<T, Error> {
|
||||||
|
let item = mem::replace(&mut self.0, ReplyItem::None);
|
||||||
|
|
||||||
|
match item {
|
||||||
|
ReplyItem::Error(err) => Err(err),
|
||||||
|
ReplyItem::Message(msg) => Ok(Async::Ready(msg)),
|
||||||
|
ReplyItem::Future(mut fut) => match fut.poll() {
|
||||||
|
Ok(Async::NotReady) => {
|
||||||
|
self.0 = ReplyItem::Future(fut);
|
||||||
|
Ok(Async::NotReady)
|
||||||
|
}
|
||||||
|
Ok(Async::Ready(msg)) => Ok(Async::Ready(msg)),
|
||||||
|
Err(err) => Err(err),
|
||||||
|
},
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) enum ReplyItem<T> {
|
pub(crate) enum ReplyItem<T> {
|
||||||
|
None,
|
||||||
Error(Error),
|
Error(Error),
|
||||||
Message(T),
|
Message(T),
|
||||||
Future(Box<Future<Item = T, Error = Error>>),
|
Future(Box<Future<Item = T, Error = Error>>),
|
||||||
|
@ -331,6 +331,7 @@ impl<S: 'static, H> WaitingResponse<S, H> {
|
|||||||
_s: PhantomData,
|
_s: PhantomData,
|
||||||
_h: PhantomData,
|
_h: PhantomData,
|
||||||
}),
|
}),
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -423,6 +423,7 @@ impl<S: 'static> WaitingResponse<S> {
|
|||||||
fut,
|
fut,
|
||||||
_s: PhantomData,
|
_s: PhantomData,
|
||||||
}),
|
}),
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -529,6 +529,7 @@ impl<S: 'static> WaitingResponse<S> {
|
|||||||
fut,
|
fut,
|
||||||
_s: PhantomData,
|
_s: PhantomData,
|
||||||
}),
|
}),
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -604,6 +604,7 @@ impl<S> TestRequest<S> {
|
|||||||
ReplyItem::Message(resp) => Ok(resp),
|
ReplyItem::Message(resp) => Ok(resp),
|
||||||
ReplyItem::Error(err) => Ok(err.into()),
|
ReplyItem::Error(err) => Ok(err.into()),
|
||||||
ReplyItem::Future(_) => panic!("Async handler is not supported."),
|
ReplyItem::Future(_) => panic!("Async handler is not supported."),
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
},
|
},
|
||||||
Err(err) => Err(err),
|
Err(err) => Err(err),
|
||||||
}
|
}
|
||||||
|
18
src/with.rs
18
src/with.rs
@ -142,6 +142,7 @@ where
|
|||||||
self.fut1 = Some(fut);
|
self.fut1 = Some(fut);
|
||||||
return self.poll();
|
return self.poll();
|
||||||
}
|
}
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
match self.fut1.as_mut().unwrap().poll()? {
|
match self.fut1.as_mut().unwrap().poll()? {
|
||||||
@ -163,6 +164,7 @@ where
|
|||||||
self.fut2 = Some(fut);
|
self.fut2 = Some(fut);
|
||||||
self.poll()
|
self.poll()
|
||||||
}
|
}
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -274,6 +276,7 @@ where
|
|||||||
self.fut1 = Some(fut);
|
self.fut1 = Some(fut);
|
||||||
return self.poll();
|
return self.poll();
|
||||||
}
|
}
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
};
|
};
|
||||||
|
|
||||||
let reply = T2::from_request(&mut self.req, self.cfg2.as_ref()).into();
|
let reply = T2::from_request(&mut self.req, self.cfg2.as_ref()).into();
|
||||||
@ -285,6 +288,7 @@ where
|
|||||||
self.fut2 = Some(fut);
|
self.fut2 = Some(fut);
|
||||||
return self.poll();
|
return self.poll();
|
||||||
}
|
}
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
};
|
};
|
||||||
|
|
||||||
let hnd: &mut F = unsafe { &mut *self.hnd.get() };
|
let hnd: &mut F = unsafe { &mut *self.hnd.get() };
|
||||||
@ -296,6 +300,7 @@ where
|
|||||||
self.fut3 = Some(fut);
|
self.fut3 = Some(fut);
|
||||||
return self.poll();
|
return self.poll();
|
||||||
}
|
}
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
},
|
},
|
||||||
Err(e) => return Err(e.into()),
|
Err(e) => return Err(e.into()),
|
||||||
}
|
}
|
||||||
@ -314,6 +319,7 @@ where
|
|||||||
self.fut2 = Some(fut);
|
self.fut2 = Some(fut);
|
||||||
return self.poll();
|
return self.poll();
|
||||||
}
|
}
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
};
|
};
|
||||||
|
|
||||||
let hnd: &mut F = unsafe { &mut *self.hnd.get() };
|
let hnd: &mut F = unsafe { &mut *self.hnd.get() };
|
||||||
@ -325,6 +331,7 @@ where
|
|||||||
self.fut3 = Some(fut);
|
self.fut3 = Some(fut);
|
||||||
return self.poll();
|
return self.poll();
|
||||||
}
|
}
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
},
|
},
|
||||||
Err(e) => return Err(e.into()),
|
Err(e) => return Err(e.into()),
|
||||||
}
|
}
|
||||||
@ -350,6 +357,7 @@ where
|
|||||||
ReplyItem::Error(err) => return Err(err),
|
ReplyItem::Error(err) => return Err(err),
|
||||||
ReplyItem::Message(resp) => return Ok(Async::Ready(resp)),
|
ReplyItem::Message(resp) => return Ok(Async::Ready(resp)),
|
||||||
ReplyItem::Future(fut) => self.fut3 = Some(fut),
|
ReplyItem::Future(fut) => self.fut3 = Some(fut),
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
}
|
}
|
||||||
|
|
||||||
self.poll()
|
self.poll()
|
||||||
@ -480,6 +488,7 @@ where
|
|||||||
self.fut1 = Some(fut);
|
self.fut1 = Some(fut);
|
||||||
return self.poll();
|
return self.poll();
|
||||||
}
|
}
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
};
|
};
|
||||||
|
|
||||||
let reply = T2::from_request(&mut self.req, self.cfg2.as_ref()).into();
|
let reply = T2::from_request(&mut self.req, self.cfg2.as_ref()).into();
|
||||||
@ -491,6 +500,7 @@ where
|
|||||||
self.fut2 = Some(fut);
|
self.fut2 = Some(fut);
|
||||||
return self.poll();
|
return self.poll();
|
||||||
}
|
}
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
};
|
};
|
||||||
|
|
||||||
let reply = T3::from_request(&mut self.req, self.cfg3.as_ref()).into();
|
let reply = T3::from_request(&mut self.req, self.cfg3.as_ref()).into();
|
||||||
@ -503,6 +513,7 @@ where
|
|||||||
self.fut3 = Some(fut);
|
self.fut3 = Some(fut);
|
||||||
return self.poll();
|
return self.poll();
|
||||||
}
|
}
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
};
|
};
|
||||||
|
|
||||||
let hnd: &mut F = unsafe { &mut *self.hnd.get() };
|
let hnd: &mut F = unsafe { &mut *self.hnd.get() };
|
||||||
@ -514,6 +525,7 @@ where
|
|||||||
self.fut4 = Some(fut);
|
self.fut4 = Some(fut);
|
||||||
return self.poll();
|
return self.poll();
|
||||||
}
|
}
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
},
|
},
|
||||||
Err(e) => return Err(e.into()),
|
Err(e) => return Err(e.into()),
|
||||||
}
|
}
|
||||||
@ -533,6 +545,7 @@ where
|
|||||||
self.fut2 = Some(fut);
|
self.fut2 = Some(fut);
|
||||||
return self.poll();
|
return self.poll();
|
||||||
}
|
}
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
};
|
};
|
||||||
|
|
||||||
let reply =
|
let reply =
|
||||||
@ -545,6 +558,7 @@ where
|
|||||||
self.fut3 = Some(fut);
|
self.fut3 = Some(fut);
|
||||||
return self.poll();
|
return self.poll();
|
||||||
}
|
}
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
};
|
};
|
||||||
let hnd: &mut F = unsafe { &mut *self.hnd.get() };
|
let hnd: &mut F = unsafe { &mut *self.hnd.get() };
|
||||||
match (*hnd)(self.item1.take().unwrap(), item2, item3)
|
match (*hnd)(self.item1.take().unwrap(), item2, item3)
|
||||||
@ -557,6 +571,7 @@ where
|
|||||||
self.fut4 = Some(fut);
|
self.fut4 = Some(fut);
|
||||||
return self.poll();
|
return self.poll();
|
||||||
}
|
}
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
},
|
},
|
||||||
Err(e) => return Err(e.into()),
|
Err(e) => return Err(e.into()),
|
||||||
}
|
}
|
||||||
@ -579,6 +594,7 @@ where
|
|||||||
self.fut3 = Some(fut);
|
self.fut3 = Some(fut);
|
||||||
return self.poll();
|
return self.poll();
|
||||||
}
|
}
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
};
|
};
|
||||||
let hnd: &mut F = unsafe { &mut *self.hnd.get() };
|
let hnd: &mut F = unsafe { &mut *self.hnd.get() };
|
||||||
match (*hnd)(self.item1.take().unwrap(), item, item3)
|
match (*hnd)(self.item1.take().unwrap(), item, item3)
|
||||||
@ -591,6 +607,7 @@ where
|
|||||||
self.fut4 = Some(fut);
|
self.fut4 = Some(fut);
|
||||||
return self.poll();
|
return self.poll();
|
||||||
}
|
}
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
},
|
},
|
||||||
Err(e) => return Err(e.into()),
|
Err(e) => return Err(e.into()),
|
||||||
}
|
}
|
||||||
@ -619,6 +636,7 @@ where
|
|||||||
ReplyItem::Error(err) => return Ok(Async::Ready(err.into())),
|
ReplyItem::Error(err) => return Ok(Async::Ready(err.into())),
|
||||||
ReplyItem::Message(resp) => return Ok(Async::Ready(resp)),
|
ReplyItem::Message(resp) => return Ok(Async::Ready(resp)),
|
||||||
ReplyItem::Future(fut) => self.fut4 = Some(fut),
|
ReplyItem::Future(fut) => self.fut4 = Some(fut),
|
||||||
|
ReplyItem::None => panic!("use after resolve"),
|
||||||
}
|
}
|
||||||
|
|
||||||
self.poll()
|
self.poll()
|
||||||
|
Loading…
Reference in New Issue
Block a user