use std::{any::type_name, rc::Rc};
use crate::{error::Result, trace::emoji, Request, Response, Server};
pub enum MiddleResult {
Continue,
Abort,
Send(Response),
}
pub trait Middleware {
fn pre_raw(&self, req: &mut Result<Request>) -> MiddleResult {
if let Ok(req) = req {
return self.pre(req);
}
MiddleResult::Continue
}
fn pre(&self, _req: &mut Request) -> MiddleResult {
MiddleResult::Continue
}
fn post_raw(&self, req: Result<Rc<Request>>, res: &mut Result<Response>) -> MiddleResult {
if let (Ok(req), Ok(res)) = (req, res) {
return self.post(&req, res);
}
MiddleResult::Continue
}
fn post(&self, _req: &Request, _res: &mut Response) -> MiddleResult {
MiddleResult::Continue
}
fn end_raw(&self, req: &Result<Request>, res: &Result<Response>) {
if let (Ok(req), Ok(res)) = (req, res) {
self.end(req, res);
}
}
fn end(&self, _req: &Request, _res: &Response) {}
fn attach<State>(self, server: &mut Server<State>)
where
Self: 'static + Send + Sync + Sized,
State: 'static + Send + Sync,
{
trace!("{}Adding Middleware {}", emoji("📦"), type_name::<Self>());
server.middleware.push(Box::new(self));
}
}