sdp-rs 0.2.1

SDP Rust library, parser & generator of the Session Description Protocol
Documentation
use crate::TResult;

#[derive(Debug, PartialEq, Eq, Clone)]
pub struct Tokenizer<'a> {
    pub payload_type: &'a str,
    pub encoding_name: &'a str,
    pub clock_rate: &'a str,
    pub encoding_params: Option<&'a str>,
}

impl<'a> Tokenizer<'a> {
    pub fn tokenize(part: &'a str) -> TResult<'a, Self> {
        use crate::parser_utils::*;
        use nom::{branch::alt, combinator::rest};

        let (rem, payload_type) = until_space(part)?;
        let (rem, encoding_name) = until_stopbreak_of("/")(rem)?;
        let (encoding_params, clock_rate) = alt((until_stopbreak_of("/"), rest))(rem)?;

        Ok((
            "",
            Tokenizer {
                payload_type,
                encoding_name,
                clock_rate,
                encoding_params: (!encoding_params.is_empty()).then(|| encoding_params),
            },
        ))
    }
}

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

    #[test]
    fn tokenizer() {
        let rtpmap = "98 L16/16000/2";

        assert_eq!(
            Tokenizer::tokenize(rtpmap),
            Ok((
                "",
                Tokenizer {
                    payload_type: "98",
                    encoding_name: "L16",
                    clock_rate: "16000",
                    encoding_params: Some("2"),
                }
            )),
        );
    }

    #[test]
    fn tokenizer2() {
        let rtpmap = "96 L8/8000";

        assert_eq!(
            Tokenizer::tokenize(rtpmap),
            Ok((
                "",
                Tokenizer {
                    payload_type: "96",
                    encoding_name: "L8",
                    clock_rate: "8000",
                    encoding_params: None,
                }
            )),
        );
    }
}