sdp-rs 0.2.1

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

#[derive(Debug, PartialEq, Eq, Clone)]
pub struct Tokenizer<'a> {
    pub parts: Vec<zone_part::Tokenizer<'a>>,
}

impl<'a> Tokenizer<'a> {
    pub fn tokenize(part: &'a str) -> TResult<'a, Self> {
        use crate::parser_utils::*;
        use nom::{bytes::complete::tag, multi::many1, sequence::preceded};

        let (rem, line) = preceded(tag("z="), until_newline)(part)?;
        let (_, parts) = many1(zone_part::Tokenizer::tokenize)(line)?;

        Ok((rem, Self { parts }))
    }
}

impl<'a> From<(&'a str, &'a str)> for Tokenizer<'a> {
    fn from((adjustment, offset): (&'a str, &'a str)) -> Self {
        Self {
            parts: vec![(adjustment, offset).into()],
        }
    }
}

impl<'a, T: Into<zone_part::Tokenizer<'a>>> From<Vec<T>> for Tokenizer<'a> {
    fn from(parts: Vec<T>) -> Self {
        Self {
            parts: parts.into_iter().map(Into::into).collect(),
        }
    }
}

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

    #[test]
    fn tokenizer1() {
        let zone = concat!("z=3730928400 -1h\r\nsomething");

        assert_eq!(
            Tokenizer::tokenize(zone),
            Ok(("something", ("3730928400", "-1h").into())),
        );
    }

    #[test]
    fn tokenizer2() {
        let zone = concat!("z=3730928400 -1h 3749680800 0\r\nsomething");

        assert_eq!(
            Tokenizer::tokenize(zone),
            Ok((
                "something",
                vec![("3730928400", "-1h"), ("3749680800", "0")].into()
            )),
        );
    }

    #[test]
    fn tokenizer3() {
        let zone = concat!("z=3730928400 -1h 3749680800 0h\r\nsomething");

        assert_eq!(
            Tokenizer::tokenize(zone),
            Ok((
                "something",
                vec![("3730928400", "-1h"), ("3749680800", "0h")].into()
            )),
        );
    }
}