composable_tower_http/extract/chain/
lite.rs1use std::future::Future;
2
3use http::HeaderMap;
4
5use crate::extract::extractor::Extractor;
6
7#[derive(Debug, Clone)]
8pub struct ChainLite<T, Fn> {
9 inner: T,
10 chain: Fn,
11}
12
13impl<T, Fn> ChainLite<T, Fn> {
14 pub const fn new(inner: T, chain: Fn) -> Self {
15 Self { inner, chain }
16 }
17}
18
19#[derive(Debug, Clone)]
20pub struct AsyncChainLite<T, Fn> {
21 inner: T,
22 chain: Fn,
23}
24
25impl<T, Fn> AsyncChainLite<T, Fn> {
26 pub const fn new(inner: T, chain: Fn) -> Self {
27 Self { inner, chain }
28 }
29}
30
31impl<Ex, Fn, T, E> Extractor for ChainLite<Ex, Fn>
32where
33 Ex: Extractor + Sync,
34 Fn: FnOnce(Ex::Extracted) -> Result<T, E> + Clone + Sync,
35 T: Clone + Send + Sync + 'static,
36 E: From<Ex::Error>,
37{
38 type Extracted = T;
39
40 type Error = E;
41
42 async fn extract(&self, headers: &HeaderMap) -> Result<Self::Extracted, Self::Error> {
43 let ex = self.inner.extract(headers).await?;
44
45 (self.chain.clone())(ex)
46 }
47}
48
49impl<Ex, Fn, T, E, Fut> Extractor for AsyncChainLite<Ex, Fn>
50where
51 Ex: Extractor + Sync,
52 Fn: FnOnce(Ex::Extracted) -> Fut + Clone + Sync,
53 Fut: Future<Output = Result<T, E>> + Send,
54 T: Clone + Send + Sync + 'static,
55 E: From<Ex::Error>,
56{
57 type Extracted = T;
58
59 type Error = E;
60
61 async fn extract(&self, headers: &HeaderMap) -> Result<Self::Extracted, Self::Error> {
62 let ex = self.inner.extract(headers).await?;
63
64 (self.chain.clone())(ex).await
65 }
66}