composable_tower_http/authorize/header/
header_extractor.rs

1use http::HeaderMap;
2
3pub trait HeaderExtractor {
4    type Error;
5
6    fn extract_header<'a>(&self, headers: &'a HeaderMap) -> Result<&'a str, Self::Error>;
7}
8
9pub trait HeaderExtractorExt: Sized + HeaderExtractor {
10    fn map_err<Fn>(self, map_err: Fn) -> MapError<Self, Fn>;
11}
12
13impl<T> HeaderExtractorExt for T
14where
15    T: Sized + HeaderExtractor,
16{
17    fn map_err<Fn>(self, map_err: Fn) -> MapError<Self, Fn> {
18        MapError::new(self, map_err)
19    }
20}
21
22#[derive(Debug, Clone)]
23pub struct MapError<T, Fn> {
24    inner: T,
25    map_err: Fn,
26}
27
28impl<T, Fn> MapError<T, Fn> {
29    pub const fn new(inner: T, map_err: Fn) -> Self {
30        Self { inner, map_err }
31    }
32}
33
34impl<H, Fn, E> HeaderExtractor for MapError<H, Fn>
35where
36    H: HeaderExtractor + Sync,
37    Fn: FnOnce(H::Error) -> E + Clone + Sync,
38{
39    type Error = E;
40
41    fn extract_header<'a>(&self, headers: &'a HeaderMap) -> Result<&'a str, Self::Error> {
42        self.inner
43            .extract_header(headers)
44            .map_err(self.map_err.clone())
45    }
46}