sdp-rs 0.2.1

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

#[derive(Debug, PartialEq, Eq, Clone)]
pub struct Tokenizer<'a> {
    pub name: &'a str,
    pub value: 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};

        if part.is_empty() {
            return Err(nom::Err::Error(TokenizerError {
                context: "break; nothing more to tokenize".into(),
                nom_kind: None,
            }));
        }

        let (rem, name_with_value) = alt((until_stopbreak_of(";"), rest))(part)?;
        let (name, value) = match name_with_value.contains('=') {
            true => {
                let (value, name) = until_stopbreak_of("=")(name_with_value)?;
                (name, Some(value))
            }
            false => (name_with_value, None),
        };

        println!("{} -- {:?}", name, value);

        Ok((rem, (name, value).into()))
    }
}

impl<'a> From<(&'a str, Option<&'a str>)> for Tokenizer<'a> {
    fn from((name, value): (&'a str, Option<&'a str>)) -> Self {
        Self { name, value }
    }
}

impl<'a> From<(&'a str, &'a str)> for Tokenizer<'a> {
    fn from((name, value): (&'a str, &'a str)) -> Self {
        Self {
            name,
            value: Some(value),
        }
    }
}

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

    #[test]
    fn tokenizer1() {
        let input = concat!("something");

        assert_eq!(
            Tokenizer::tokenize(input),
            Ok((
                "",
                Tokenizer {
                    name: "something",
                    value: None,
                }
            )),
        );
    }

    #[test]
    fn tokenizer2() {
        let input = concat!("something;");

        assert_eq!(
            Tokenizer::tokenize(input),
            Ok((
                "",
                Tokenizer {
                    name: "something",
                    value: None,
                }
            )),
        );
    }

    #[test]
    fn tokenizer3() {
        let input = concat!("something=else");

        assert_eq!(
            Tokenizer::tokenize(input),
            Ok((
                "",
                Tokenizer {
                    name: "something",
                    value: Some("else"),
                }
            )),
        );
    }

    #[test]
    fn tokenizer4() {
        let input = concat!("something=else;");

        assert_eq!(
            Tokenizer::tokenize(input),
            Ok((
                "",
                Tokenizer {
                    name: "something",
                    value: Some("else"),
                }
            )),
        );
    }
}