1#![forbid(unsafe_code)]
2
3use std::future::Future;
4use std::pin::Pin;
5use std::task::{Context, Poll};
6
7use pin_project_lite::pin_project;
8use puzz_core::service::util::BoxFuture;
9use puzz_core::{BoxError, Response};
10
11mod method;
12mod router;
13
14pub mod error;
15
16pub use method::*;
17pub use router::*;
18
19pin_project! {
20 #[project = RouteFutureProj]
21 pub enum RouteFuture {
22 Future {
23 #[pin]
24 fut: BoxFuture<Result<Response, BoxError>>,
25 },
26 Error {
27 err: Option<BoxError>,
28 },
29 }
30}
31
32impl Future for RouteFuture {
33 type Output = Result<Response, BoxError>;
34
35 fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
36 match self.project() {
37 RouteFutureProj::Future { fut } => fut.poll(cx),
38 RouteFutureProj::Error { err } => {
39 Poll::Ready(Err(err.take().expect("polled after completion").into()))
40 }
41 }
42 }
43}