use crate::{
common::{errorparse::SipParseError, take_sws_token},
headers::{
header::{HeaderTagType, HeaderTags, HeaderValue, HeaderValueType},
traits::SipHeaderParser,
},
};
use nom::bytes::complete::take_while1;
pub struct AlertInfoParser;
impl SipHeaderParser for AlertInfoParser {
fn take_value(source_input: &[u8]) -> nom::IResult<&[u8], HeaderValue, SipParseError> {
let (input, _) = take_sws_token::laquot(source_input)?;
let (input, uri) = take_while1(|c| c != b'>')(input)?;
let (input, spaces_after_raquot) = take_sws_token::raquot(input)?;
let mut tags = HeaderTags::new();
tags.insert(HeaderTagType::AbsoluteURI, uri);
let (_, hdr_val) = HeaderValue::new(
&source_input[..source_input.len() - input.len() - spaces_after_raquot.len()],
HeaderValueType::AbsoluteURI,
Some(tags),
None,
)?;
Ok((input, hdr_val))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn headers_parse_test() {
let (input, val) = AlertInfoParser::take_value(
"<http://www.example.com/sounds/moo.wav> \r\n".as_bytes(),
)
.unwrap();
assert_eq!(input, "\r\n".as_bytes());
assert_eq!(
val.tags().unwrap()[&HeaderTagType::AbsoluteURI],
"http://www.example.com/sounds/moo.wav".as_bytes()
);
assert_eq!(val.vstr, "<http://www.example.com/sounds/moo.wav>");
match AlertInfoParser::take_value("random word\r\n".as_bytes()) {
Ok((_, _)) => {
panic!();
}
Err(_) => {}
}
}
}