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