composable_tower_http/extract/
optional.rs

1use http::HeaderMap;
2
3use crate::error::InfallibleError;
4
5use super::extractor::Extractor;
6
7#[derive(Debug, Clone)]
8pub struct Optional<T> {
9    inner: T,
10}
11
12impl<T> Optional<T> {
13    pub const fn new(inner: T) -> Self {
14        Self { inner }
15    }
16}
17
18impl<Ex> Extractor for Optional<Ex>
19where
20    Ex: Extractor + Sync,
21{
22    type Extracted = Option<Ex::Extracted>;
23
24    type Error = InfallibleError;
25
26    async fn extract(&self, headers: &HeaderMap) -> Result<Self::Extracted, Self::Error> {
27        Ok(self.inner.extract(headers).await.ok())
28    }
29}