Skip to main content

http_msgsign/components/
name.rs

1use std::fmt::Display;
2
3use crate::components::Derive;
4use crate::errors::InvalidFormat;
5
6#[derive(Debug, Clone, Eq, PartialEq, Hash)]
7pub enum NameType {
8    Derived(Derive),
9    Field(http::HeaderName),
10}
11
12impl Display for NameType {
13    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14        match self {
15            NameType::Derived(derived) => Display::fmt(&derived, f),
16            NameType::Field(name) => write!(f, "\"{name}\""),
17        }
18    }
19}
20
21impl From<http::HeaderName> for NameType {
22    fn from(value: http::HeaderName) -> Self {
23        Self::Field(value)
24    }
25}
26
27impl TryFrom<sfv::BareItem> for NameType {
28    type Error = InvalidFormat;
29
30    fn try_from(value: sfv::BareItem) -> Result<Self, Self::Error> {
31        if Derive::contains(&value) {
32            Derive::try_from(value).map(NameType::Derived)
33        } else {
34            let sfv::BareItem::String(ident) = value else {
35                return Err(InvalidFormat::String);
36            };
37            Ok(NameType::Field(
38                http::HeaderName::try_from(String::from(ident))
39                    .map_err(|e| InvalidFormat::HeaderName(e.into()))?,
40            ))
41        }
42    }
43}