Skip to main content

rama_http/layer/classify/
map_failure_class.rs

1use super::{ClassifiedResponse, ClassifyEos, ClassifyResponse};
2use crate::{HeaderMap, Response};
3
4/// Response classifier that transforms the failure class of some other
5/// classifier.
6///
7/// Created with [`ClassifyResponse::map_failure_class`] or
8/// [`ClassifyEos::map_failure_class`].
9#[derive(Debug, Clone)]
10pub struct MapFailureClass<C, F> {
11    inner: C,
12    f: F,
13}
14
15impl<C, F> MapFailureClass<C, F> {
16    pub(super) fn new(classify: C, f: F) -> Self {
17        Self { inner: classify, f }
18    }
19}
20
21impl<C, F, NewClass> ClassifyResponse for MapFailureClass<C, F>
22where
23    C: ClassifyResponse + Send + Sync + 'static,
24    F: FnOnce(C::FailureClass) -> NewClass + Send + Sync + 'static,
25    NewClass: Send + Sync + 'static,
26{
27    type FailureClass = NewClass;
28    type ClassifyEos = MapFailureClass<C::ClassifyEos, F>;
29
30    fn classify_response<B>(
31        self,
32        res: &Response<B>,
33    ) -> ClassifiedResponse<Self::FailureClass, Self::ClassifyEos> {
34        match self.inner.classify_response(res) {
35            ClassifiedResponse::Ready(result) => ClassifiedResponse::Ready(result.map_err(self.f)),
36            ClassifiedResponse::RequiresEos(classify_eos) => {
37                let mapped_classify_eos = MapFailureClass::new(classify_eos, self.f);
38                ClassifiedResponse::RequiresEos(mapped_classify_eos)
39            }
40        }
41    }
42
43    fn classify_error<E>(self, error: &E) -> Self::FailureClass
44    where
45        E: std::fmt::Display,
46    {
47        (self.f)(self.inner.classify_error(error))
48    }
49}
50
51impl<C, F, NewClass> ClassifyEos for MapFailureClass<C, F>
52where
53    C: ClassifyEos,
54    F: FnOnce(C::FailureClass) -> NewClass,
55{
56    type FailureClass = NewClass;
57
58    fn classify_eos(self, trailers: Option<&HeaderMap>) -> Result<(), Self::FailureClass> {
59        self.inner.classify_eos(trailers).map_err(self.f)
60    }
61
62    fn classify_error<E>(self, error: &E) -> Self::FailureClass
63    where
64        E: std::fmt::Display,
65    {
66        (self.f)(self.inner.classify_error(error))
67    }
68}