composable_tower_http/authorize/header/bearer/
bearer_extractor.rs1use 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}