puzz_route/
lib.rs

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}