use crate::state::{request_id, State};
use hyper::body::HttpBody;
use hyper::{Body, Response};
use log::trace;
use std::panic::RefUnwindSafe;
pub trait StaticResponseExtender: RefUnwindSafe {
type ResBody: HttpBody;
fn extend(state: &mut State, response: &mut Response<Self::ResBody>);
}
pub trait ResponseExtender<B>: RefUnwindSafe {
fn extend(&self, state: &mut State, response: &mut Response<B>);
}
impl<F, B> ResponseExtender<B> for F
where
F: Fn(&mut State, &mut Response<B>) + Send + Sync + RefUnwindSafe,
{
fn extend(&self, state: &mut State, res: &mut Response<B>) {
trace!(
"[{}] running closure based response extender",
request_id(state)
);
self(state, res);
}
}
pub struct NoopResponseExtender;
impl StaticResponseExtender for NoopResponseExtender {
type ResBody = Body;
fn extend(state: &mut State, _res: &mut Response<Body>) {
trace!(
"[{}] NoopResponseExtender invoked, does not make any changes to Response",
request_id(state)
);
trace!("[{}] no response body, no change made", request_id(state));
}
}
impl ResponseExtender<Body> for NoopResponseExtender {
fn extend(&self, state: &mut State, _res: &mut Response<Body>) {
trace!(
"[{}] NoopResponseExtender invoked on instance, does not make any changes to Response",
request_id(state)
);
trace!("[{}] no response body, no change made", request_id(state));
}
}