sipmsg 0.2.3

SIP message parser
Documentation
use crate::{
    common::{bnfcore::is_digit, errorparse::SipParseError},
    headers::{
        header::{HeaderTagType, HeaderTags, HeaderValue, HeaderValueType},
        traits::SipHeaderParser
    }
};
use nom::bytes::complete::take_while1;

pub struct MimeVersion;

impl SipHeaderParser for MimeVersion {
    fn take_value(source_input: &[u8]) -> nom::IResult<&[u8], HeaderValue, SipParseError> {
        let (inp, major) = take_while1(is_digit)(source_input)?;
        let (inp, _) = nom::character::complete::char('.')(inp)?;
        let (inp, minor) = take_while1(is_digit)(inp)?;
        let mut tags = HeaderTags::new();
        tags.insert(HeaderTagType::Major, major);
        tags.insert(HeaderTagType::Minor, minor);
        let (_, hdr_val) = HeaderValue::new(
            &source_input[..source_input.len() - inp.len()],
            HeaderValueType::Digit,
            Some(tags),
            None,
        )?;
        Ok((inp, hdr_val))
    }
}

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn test_mime_value() {
        let (input, val) = MimeVersion::take_value("1.2 \r\n".as_bytes()).unwrap();
        assert_eq!(input, " \r\n".as_bytes());
        assert_eq!(val.vstr, "1.2");
        assert_eq!(
            val.tags().unwrap()[&HeaderTagType::Major],
            "1".as_bytes()
        );
        assert_eq!(
            val.tags().unwrap()[&HeaderTagType::Minor],
            "2".as_bytes()
        );
    }
}