freeswitch_types/variables/
sip_invite.rs1#[derive(Debug, Clone, PartialEq, Eq)]
13pub struct ParseSipInviteHeaderError(pub String);
14
15impl std::fmt::Display for ParseSipInviteHeaderError {
16 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17 write!(f, "unknown SIP invite header variable: {}", self.0)
18 }
19}
20
21impl std::error::Error for ParseSipInviteHeaderError {}
22
23define_header_enum! {
24 error_type: ParseSipInviteHeaderError,
25 pub enum SipInviteHeader {
40 From => "sip_i_from",
44 To => "sip_i_to",
46 CallId => "sip_i_call_id",
48 Cseq => "sip_i_cseq",
50 Identity => "sip_i_identity",
52 Route => "sip_i_route",
54 MaxForwards => "sip_i_max_forwards",
56 ProxyRequire => "sip_i_proxy_require",
58 Contact => "sip_i_contact",
60 UserAgent => "sip_i_user_agent",
62 Subject => "sip_i_subject",
64 Priority => "sip_i_priority",
66 Organization => "sip_i_organization",
68 InReplyTo => "sip_i_in_reply_to",
70 AcceptEncoding => "sip_i_accept_encoding",
72 AcceptLanguage => "sip_i_accept_language",
74 Allow => "sip_i_allow",
76 Require => "sip_i_require",
78 Supported => "sip_i_supported",
80 Date => "sip_i_date",
82 Timestamp => "sip_i_timestamp",
84 Expires => "sip_i_expires",
86 MinExpires => "sip_i_min_expires",
88 SessionExpires => "sip_i_session_expires",
90 MinSe => "sip_i_min_se",
92 Privacy => "sip_i_privacy",
94 MimeVersion => "sip_i_mime_version",
96 ContentType => "sip_i_content_type",
98 ContentEncoding => "sip_i_content_encoding",
100 ContentLanguage => "sip_i_content_language",
102 ContentDisposition => "sip_i_content_disposition",
104 ContentLength => "sip_i_content_length",
106
107 Via => "sip_i_via",
111 RecordRoute => "sip_i_record_route",
113 ProxyAuthorization => "sip_i_proxy_authorization",
115 CallInfo => "sip_i_call_info",
117 Accept => "sip_i_accept",
119 Authorization => "sip_i_authorization",
121 AlertInfo => "sip_i_alert_info",
123 PAssertedIdentity => "sip_i_p_asserted_identity",
125 PPreferredIdentity => "sip_i_p_preferred_identity",
127 RemotePartyId => "sip_i_remote_party_id",
129 ReplyTo => "sip_i_reply_to",
131 }
132}
133
134impl SipInviteHeader {
135 pub const ARRAY_HEADERS: &[SipInviteHeader] = &[
137 SipInviteHeader::Via,
138 SipInviteHeader::RecordRoute,
139 SipInviteHeader::ProxyAuthorization,
140 SipInviteHeader::CallInfo,
141 SipInviteHeader::Accept,
142 SipInviteHeader::Authorization,
143 SipInviteHeader::AlertInfo,
144 SipInviteHeader::PAssertedIdentity,
145 SipInviteHeader::PPreferredIdentity,
146 SipInviteHeader::RemotePartyId,
147 SipInviteHeader::ReplyTo,
148 ];
149
150 pub fn is_array_header(&self) -> bool {
152 Self::ARRAY_HEADERS.contains(self)
153 }
154}
155
156#[cfg(test)]
157mod tests {
158 use super::*;
159
160 #[test]
161 fn display_round_trip() {
162 assert_eq!(
163 SipInviteHeader::PAssertedIdentity.to_string(),
164 "sip_i_p_asserted_identity"
165 );
166 assert_eq!(SipInviteHeader::From.to_string(), "sip_i_from");
167 assert_eq!(SipInviteHeader::Via.to_string(), "sip_i_via");
168 }
169
170 #[test]
171 fn as_ref_str() {
172 let v: &str = SipInviteHeader::CallId.as_ref();
173 assert_eq!(v, "sip_i_call_id");
174 }
175
176 #[test]
177 fn from_str_case_insensitive() {
178 assert_eq!(
179 "sip_i_p_asserted_identity".parse::<SipInviteHeader>(),
180 Ok(SipInviteHeader::PAssertedIdentity)
181 );
182 assert_eq!(
183 "SIP_I_P_ASSERTED_IDENTITY".parse::<SipInviteHeader>(),
184 Ok(SipInviteHeader::PAssertedIdentity)
185 );
186 }
187
188 #[test]
189 fn from_str_unknown() {
190 assert!("sip_i_nonexistent"
191 .parse::<SipInviteHeader>()
192 .is_err());
193 }
194
195 #[test]
196 fn from_str_round_trip_all() {
197 let variants = [
198 SipInviteHeader::From,
199 SipInviteHeader::To,
200 SipInviteHeader::CallId,
201 SipInviteHeader::Via,
202 SipInviteHeader::RecordRoute,
203 SipInviteHeader::PAssertedIdentity,
204 SipInviteHeader::PPreferredIdentity,
205 SipInviteHeader::RemotePartyId,
206 SipInviteHeader::AlertInfo,
207 SipInviteHeader::Privacy,
208 SipInviteHeader::ContentType,
209 ];
210 for v in variants {
211 let wire = v.to_string();
212 let parsed: SipInviteHeader = wire
213 .parse()
214 .unwrap();
215 assert_eq!(parsed, v, "round-trip failed for {wire}");
216 }
217 }
218
219 #[test]
220 fn array_headers_classification() {
221 assert!(SipInviteHeader::Via.is_array_header());
222 assert!(SipInviteHeader::PAssertedIdentity.is_array_header());
223 assert!(SipInviteHeader::RecordRoute.is_array_header());
224 assert!(!SipInviteHeader::From.is_array_header());
225 assert!(!SipInviteHeader::CallId.is_array_header());
226 assert!(!SipInviteHeader::ContentType.is_array_header());
227 }
228}