composable_tower_http/authorize/header/bearer/
bearer_extractor.rs

1use http::HeaderMap;
2
3pub trait BearerExtractor {
4    type Error;
5
6    fn extract_bearer<'a>(&self, headers: &'a HeaderMap) -> Result<&'a str, Self::Error>;
7}
8
9pub trait BearerExtractorExt: Sized + BearerExtractor {
10    fn map_err<Fn>(self, map_err: Fn) -> MapError<Self, Fn>;
11}
12
13impl<T> BearerExtractorExt for T
14where
15    T: Sized + BearerExtractor,
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<B, Fn, E> BearerExtractor for MapError<B, Fn>
35where
36    B: BearerExtractor + Sync,
37    Fn: FnOnce(B::Error) -> E + Clone + Sync,
38{
39    type Error = E;
40
41    fn extract_bearer<'a>(&self, headers: &'a HeaderMap) -> Result<&'a str, Self::Error> {
42        self.inner
43            .extract_bearer(headers)
44            .map_err(self.map_err.clone())
45    }
46}