use qubit_function::{ArcMutatingFunction, MutatingFunction};
use super::HttpResponseMeta;
use crate::HttpResult;
pub type HttpResponseInterceptor = ArcMutatingFunction<HttpResponseMeta, 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<()> {
for interceptor in &self.interceptors {
interceptor.apply(response_meta).map_err(|error| {
let mut mapped = error;
if mapped.status.is_none() {
mapped = mapped.with_status(response_meta.status);
}
if mapped.method.is_none() {
mapped = mapped.with_method(&response_meta.method);
}
if mapped.url.is_none() {
mapped = mapped.with_url(&response_meta.url);
}
mapped
})?;
}
Ok(())
}
}