1use std::{collections::HashMap, fmt};
2
3use super::*;
4
5impl fmt::Display for Header {
6 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
7 match self {
8 Header::To(value) => write_simple_field("To", value, f),
9 Header::From(value) => write_simple_field("From", value, f),
10 Header::Contact(value) => write_simple_field("Contact", value, f),
11 Header::ReplyTo(value) => write_simple_field("Reply-To", value, f),
12 Header::CSeq(num, method) => write!(f, "CSeq: {} {}", num, method),
13 Header::MaxForwards(num) => write!(f, "Max-Forwards: {}", num),
14 Header::Expires(num) => write!(f, "Expires: {}", num),
15 Header::Event(value) => write!(f, "Event: {}", value),
16 Header::Accept(methods) => write_method_array_header("Accept", f, methods),
17 Header::Allow(methods) => write_method_array_header("Allow", f, methods),
18 Header::ContentEncoding(ty) => write_simple_field("Content-Encoding", ty, f),
19 Header::ContentLength(len) => write_simple_field("Content-Length", len, f),
20 Header::ContentType(ty) => write_simple_field("Content-Type", ty, f),
21 Header::UserAgent(agent) => write_simple_field("User-Agent", agent, f),
22 Header::CallId(call_id) => write_simple_field("Call-ID", call_id, f),
23 Header::ContentLanguage(lang) => write_simple_field("Content-Language", lang, f),
24 Header::AcceptLanguage(lang) => write_simple_field("Accept-Language", lang, f),
25 Header::AcceptEncoding(ty) => write_simple_field("Accept-Encoding", ty, f),
26 Header::AlertInfo(data) => write_simple_field("Alert-Info", data, f),
27 Header::ErrorInfo(data) => write_simple_field("Error-Info", data, f),
28 Header::AuthenticationInfo(data) => write_simple_field("Authentication-Info", data, f),
29 Header::Authorization(data) => write_auth_header("Authorization", data, f),
30 Header::CallInfo(data) => write_simple_field("Call-Info", data, f),
31 Header::InReplyTo(data) => write_simple_field("In-Reply-To", data, f),
32 Header::ContentDisposition(data) => write_simple_field("Content-Disposition", data, f),
33 Header::Date(string) => write_simple_field("Date", string, f),
34 Header::MinExpires(exp) => write_simple_field("Min-Expires", exp, f),
35 Header::MimeVersion(exp) => write_simple_field("MIME-Version", exp, f),
36 Header::Organization(org) => write_simple_field("Organization", org, f),
37 Header::ProxyAuthenticate(data) => write_simple_field("Proxy-Authenticate", data, f),
38 Header::ProxyAuthorization(data) => write_simple_field("Proxy-Authorization", data, f),
39 Header::ProxyRequire(data) => write_simple_field("Proxy-Require", data, f),
40 Header::Require(data) => write_simple_field("Require", data, f),
41 Header::RetryAfter(data) => write_simple_field("Retry-After", data, f),
42 Header::Route(data) => write_simple_field("Route", data, f),
43 Header::Subject(data) => write_simple_field("Subject", data, f),
44 Header::SubscriptionState(data) => write_simple_field("Subscription-State", data, f),
45 Header::RecordRoute(data) => write_simple_field("Record-Route", data, f),
46 Header::Server(data) => write_simple_field("Server", data, f),
47 Header::Supported(data) => write_string_array_header("Supported", f, data),
48 Header::Timestamp(data) => write_simple_field("Timestamp", data, f),
49 Header::Unsupported(data) => write_simple_field("Unsupported", data, f),
50 Header::Warning(data) => write_simple_field("Warning", data, f),
51 Header::Via(data) => write!(f, "{}", data),
52 Header::Priority(data) => write_simple_field("Priority", data, f),
53 Header::WwwAuthenticate(data) => write_auth_header("WWW-Authenticate", data, f),
54 Header::XFsSendingMessage(data) => write_simple_field("X-FS-Sending-Message", data, f),
55 Header::Other(key, value) => write!(f, "{}: {}", key, value),
56 }
57 }
58}
59
60macro_rules! write_array_header {
61 ($name:ident, $item:ident) => {
62 fn $name(name: &str, f: &mut fmt::Formatter, v: &[$item]) -> fmt::Result {
63 write!(f, "{}: ", name)?;
64 for (index, item) in v.iter().enumerate() {
65 if index == 0 {
66 write!(f, "{}", item)?;
67 } else {
68 write!(f, ",{}", item)?;
69 }
70 }
71 Ok(())
72 }
73 };
74}
75
76write_array_header!(write_method_array_header, Method);
77write_array_header!(write_string_array_header, String);
78fn write_simple_field<D: fmt::Display>(
79 header: &str,
80 data: D,
81 f: &mut fmt::Formatter,
82) -> fmt::Result {
83 write!(f, "{}: {}", header, data)
84}
85
86fn write_auth_header<D: fmt::Display>(
87 header: &str,
88 data: D,
89 f: &mut fmt::Formatter,
90) -> fmt::Result {
91 write!(f, "{}: {}", header, data)
92}
93
94pub fn write_optional_param<V: fmt::Display>(
96 param: &str,
97 value: &Option<V>,
98 f: &mut fmt::Formatter,
99) -> fmt::Result {
100 if let Some(value) = value {
101 write!(f, ";{}={}", param, value)
102 } else {
103 Ok(())
104 }
105}
106
107pub fn write_generic_params(
109 params: &HashMap<String, Option<String>>,
110 f: &mut fmt::Formatter,
111) -> fmt::Result {
112 for (name, value) in params.iter() {
113 write!(f, ";{}", name)?;
114 if let Some(value) = value {
115 write!(f, "={}", value)?;
116 }
117 }
118 Ok(())
119}