use nova_core::errors::ServerError;
use nova_core::request::HttpRequest;
use nova_core::response::HttpResponse;
use std::collections::HashMap;
use std::fmt::Debug;
use crate::middleware::BoxedMiddleware;
#[derive(Clone, Debug, Default)]
pub struct Middlewares {
inner: HashMap<String, BoxedMiddleware>,
}
impl Middlewares {
pub fn register(&mut self, middle: BoxedMiddleware) {
self.inner.insert(uuid::Uuid::new_v4().to_string(), middle);
}
pub fn call_for_req(&self, request: &mut HttpRequest) -> Result<(), ServerError> {
let binding = self
.inner
.values()
.map(|boxed| boxed.request(request))
.collect::<Vec<Result<(), _>>>();
let error = binding.iter().find(|item| item.is_err());
error.map_or(Ok(()), Clone::clone)
}
pub fn call_for_res(
&self,
request: &HttpRequest,
response: &mut HttpResponse,
) -> Result<(), ServerError> {
let binding = self
.inner
.values()
.map(|boxed| boxed.response(request, response))
.collect::<Vec<Result<(), _>>>();
let error = binding.iter().find(|item| item.is_err());
error.map_or(Ok(()), Clone::clone)
}
}