rama_http/layer/classify/
map_failure_class.rs1use super::{ClassifiedResponse, ClassifyEos, ClassifyResponse};
2use crate::{HeaderMap, Response};
3
4#[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}