actix_http/header/
as_name.rs

1//! Sealed [`AsHeaderName`] trait and implementations.
2
3use std::{borrow::Cow, str::FromStr as _};
4
5use http::header::{HeaderName, InvalidHeaderName};
6
7/// Sealed trait implemented for types that can be effectively borrowed as a [`HeaderValue`].
8///
9/// [`HeaderValue`]: super::HeaderValue
10pub trait AsHeaderName: Sealed {}
11
12pub struct Seal;
13
14pub trait Sealed {
15    fn try_as_name(&self, seal: Seal) -> Result<Cow<'_, HeaderName>, InvalidHeaderName>;
16}
17
18impl Sealed for HeaderName {
19    #[inline]
20    fn try_as_name(&self, _: Seal) -> Result<Cow<'_, HeaderName>, InvalidHeaderName> {
21        Ok(Cow::Borrowed(self))
22    }
23}
24impl AsHeaderName for HeaderName {}
25
26impl Sealed for &HeaderName {
27    #[inline]
28    fn try_as_name(&self, _: Seal) -> Result<Cow<'_, HeaderName>, InvalidHeaderName> {
29        Ok(Cow::Borrowed(*self))
30    }
31}
32impl AsHeaderName for &HeaderName {}
33
34impl Sealed for &str {
35    #[inline]
36    fn try_as_name(&self, _: Seal) -> Result<Cow<'_, HeaderName>, InvalidHeaderName> {
37        HeaderName::from_str(self).map(Cow::Owned)
38    }
39}
40impl AsHeaderName for &str {}
41
42impl Sealed for String {
43    #[inline]
44    fn try_as_name(&self, _: Seal) -> Result<Cow<'_, HeaderName>, InvalidHeaderName> {
45        HeaderName::from_str(self).map(Cow::Owned)
46    }
47}
48impl AsHeaderName for String {}
49
50impl Sealed for &String {
51    #[inline]
52    fn try_as_name(&self, _: Seal) -> Result<Cow<'_, HeaderName>, InvalidHeaderName> {
53        HeaderName::from_str(self).map(Cow::Owned)
54    }
55}
56impl AsHeaderName for &String {}