sdp-rs 0.2.1

SDP Rust library, parser & generator of the Session Description Protocol
Documentation
use crate::{tokenizers::attributes::name_optvalue::Tokenizer as ParamsTokenizer, Error};

/// The fmtp tokenizer, which is part of the attribute (`a=`) line. This is low
/// level stuff and you shouldn't interact directly with it, unless you know what you are doing.
pub use crate::tokenizers::attributes::fmtp::Tokenizer;

/// The `fmtp` attribute as it appears in the attribute line(s) (`a=`).
#[derive(Debug, PartialEq, Eq, Ord, PartialOrd, Clone)]
pub struct Fmtp {
    pub fmt: String,
    pub params: String,
}

impl Fmtp {
    pub fn params_list(&self) -> Result<Vec<(&str, Option<&str>)>, Error> {
        use nom::multi::many1;

        let (_, tokenizers) = many1(ParamsTokenizer::tokenize)(&self.params)?;

        Ok(tokenizers.into_iter().map(|t| (t.name, t.value)).collect())
    }
}

impl<'a> From<Tokenizer<'a>> for Fmtp {
    fn from(tokenizer: Tokenizer<'a>) -> Self {
        Self {
            fmt: tokenizer.fmt.into(),
            params: tokenizer.params.into(),
        }
    }
}

impl std::fmt::Display for Fmtp {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{} {}", self.fmt, self.params)
    }
}

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

    #[test]
    fn from_str1() {
        let tokenizer = Tokenizer {
            fmt: "96",
            params: "profile-level-id=42e016;max-mbps=108000;max-fs=3600",
        };

        assert_eq!(
            Fmtp::try_from(tokenizer),
            Ok(Fmtp {
                fmt: "96".into(),
                params: "profile-level-id=42e016;max-mbps=108000;max-fs=3600".into(),
            })
        );
    }

    #[test]
    fn params_list1() {
        let fmtp = Fmtp {
            fmt: "96".into(),
            params: "profile-level-id=42e016;max-mbps=108000;max-fs=3600".into(),
        };

        assert_eq!(
            fmtp.params_list(),
            Ok(vec![
                ("profile-level-id", Some("42e016")),
                ("max-mbps", Some("108000")),
                ("max-fs", Some("3600")),
            ])
        );
    }

    #[test]
    fn params_list2() {
        let fmtp = Fmtp {
            fmt: "96".into(),
            params: "profile-level-id=42e016;max-mbps=108000;max-fs=3600;".into(),
        };

        assert_eq!(
            fmtp.params_list(),
            Ok(vec![
                ("profile-level-id", Some("42e016")),
                ("max-mbps", Some("108000")),
                ("max-fs", Some("3600")),
            ])
        );
    }

    #[test]
    fn params_list3() {
        let fmtp = Fmtp {
            fmt: "96".into(),
            params: "profile-level-id;max-mbps=108000;max-fs".into(),
        };

        assert_eq!(
            fmtp.params_list(),
            Ok(vec![
                ("profile-level-id", None),
                ("max-mbps", Some("108000")),
                ("max-fs", None),
            ])
        );
    }

    #[test]
    fn display1() {
        assert_eq!(
            Fmtp {
                fmt: "96".into(),
                params: "profile-level-id;max-mbps=108000;max-fs".into(),
            }
            .to_string(),
            "96 profile-level-id;max-mbps=108000;max-fs"
        );
    }
}