use std::collections::VecDeque;
use std::sync::Arc;
use crate::middleware::{BoxFuture, Middleware};
use crate::request::Request;
pub struct Continue;
pub struct Next<App = ()> {
deque: VecDeque<Arc<dyn Middleware<App>>>,
}
impl<App> Middleware<App> for Continue {
fn call(&self, request: Request<App>, next: Next<App>) -> BoxFuture {
next.call(request)
}
}
impl<App> Next<App> {
#[inline]
pub(crate) fn new(deque: VecDeque<Arc<dyn Middleware<App>>>) -> Self {
Self { deque }
}
pub fn call(mut self, request: Request<App>) -> BoxFuture {
match self.deque.pop_front() {
Some(middleware) => middleware.call(request, self),
None => Box::pin(async { crate::raise!(404) }),
}
}
}
impl<App> Drop for Next<App> {
fn drop(&mut self) {}
}