sipmsg/headers/parsers/
alertinfo.rs1use crate::{
2 common::{errorparse::SipParseError, take_sws_token},
3 headers::{
4 header::{HeaderTagType, HeaderTags, HeaderValue, HeaderValueType},
5 traits::SipHeaderParser,
6 },
7};
8
9use nom::bytes::complete::take_while1;
10
11pub struct AlertInfoParser;
14
15impl SipHeaderParser for AlertInfoParser {
16 fn take_value(source_input: &[u8]) -> nom::IResult<&[u8], HeaderValue, SipParseError> {
17 let (input, _) = take_sws_token::laquot(source_input)?;
19 let (input, uri) = take_while1(|c| c != b'>')(input)?;
20 let (input, spaces_after_raquot) = take_sws_token::raquot(input)?;
21
22
23 let mut tags = HeaderTags::new();
24 tags.insert(HeaderTagType::AbsoluteURI, uri);
25
26 let (_, hdr_val) = HeaderValue::new(
28 &source_input[..source_input.len() - input.len() - spaces_after_raquot.len()],
29 HeaderValueType::AbsoluteURI,
30 Some(tags),
31 None,
32 )?;
33 Ok((input, hdr_val))
34 }
35}
36
37#[cfg(test)]
38mod tests {
39 use super::*;
40 #[test]
41 fn headers_parse_test() {
42 let (input, val) = AlertInfoParser::take_value(
43 "<http://www.example.com/sounds/moo.wav> \r\n".as_bytes(),
44 )
45 .unwrap();
46
47 assert_eq!(input, "\r\n".as_bytes());
48 assert_eq!(
49 val.tags().unwrap()[&HeaderTagType::AbsoluteURI],
50 "http://www.example.com/sounds/moo.wav".as_bytes()
51 );
52 assert_eq!(val.vstr, "<http://www.example.com/sounds/moo.wav>");
53
54 match AlertInfoParser::take_value("random word\r\n".as_bytes()) {
55 Ok((_, _)) => {
56 panic!();
57 }
58 Err(_) => {}
59 }
60 }
61}