use qubit_function::{
ArcMutatingFunction,
MutatingFunction,
};
use super::HttpResponseInterceptorContext;
use super::HttpResponseMeta;
use crate::HttpResult;
pub type HttpResponseInterceptor = ArcMutatingFunction<HttpResponseInterceptorContext, HttpResult<()>>;
#[derive(Debug, Clone, Default)]
pub struct HttpResponseInterceptors {
interceptors: Vec<HttpResponseInterceptor>,
}
impl HttpResponseInterceptors {
pub fn new() -> Self {
Self::default()
}
pub fn push(&mut self, interceptor: HttpResponseInterceptor) {
self.interceptors.push(interceptor);
}
pub fn clear(&mut self) {
self.interceptors.clear();
}
pub fn apply(&self, response_meta: &mut HttpResponseMeta) -> HttpResult<()> {
let mut context = HttpResponseInterceptorContext::from_meta(response_meta);
for interceptor in &self.interceptors {
interceptor.apply(&mut context).map_err(|error| {
let mut mapped = error;
if mapped.status.is_none() {
mapped = mapped.with_status(context.status());
}
if mapped.method.is_none() {
mapped = mapped.with_method(context.method());
}
if mapped.url.is_none() {
mapped = mapped.with_url(context.url());
}
mapped
})?;
}
context.apply_to_meta(response_meta);
Ok(())
}
}