libsip/headers/
write.rs

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
94/// Writes an optional parameter if it has any value, prepending it with ';'.
95pub 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
107/// Writes generic parameters, adding ';' before each (including the first one)
108pub 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}