http_msgsign/components/
name.rs1use 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}