Skip to main content

libsdp/attributes/
optional.rs

1use crate::parse::ParserResult;
2use crate::lines::parse_email_line;
3use crate::lines::parse_uri_line;
4use crate::core::parse_bandwidth_line;
5use crate::lines::parse_connection_name;
6use crate::lines::parse_phone_line;
7use crate::lines::parse_information_line;
8use crate::lines::parse_time_line;
9use crate::SdpTiming;
10use crate::SdpConnection;
11use crate::SdpBandwidth;
12
13use nom::{
14    IResult,
15    branch::alt,
16};
17
18use std::fmt;
19
20#[derive(Debug, PartialEq, Clone)]
21pub enum SdpOptionalAttribute {
22    Connection(SdpConnection),
23    Email(String),
24    Phone(String),
25    Information(String),
26    Bandwidth(SdpBandwidth),
27    Timing(SdpTiming),
28    Uri(String)
29}
30
31impl fmt::Display for SdpOptionalAttribute {
32    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
33        match self {
34            SdpOptionalAttribute::Connection(conn) => write!(f, "c={}", conn),
35            SdpOptionalAttribute::Email(email) => write!(f, "e={}", email),
36            SdpOptionalAttribute::Phone(phone) => write!(f, "p={}", phone),
37            SdpOptionalAttribute::Information(information) => write!(f, "i={}", information),
38            SdpOptionalAttribute::Bandwidth(bandwidth) => write!(f, "b={}", bandwidth),
39            SdpOptionalAttribute::Timing(timing) => write!(f, "t={}", timing),
40            SdpOptionalAttribute::Uri(uri) => write!(f, "u={}", uri),
41        }
42    }
43}
44
45pub fn parse_optional_sdp_attribute(input: &[u8]) -> IResult<&[u8], SdpOptionalAttribute> {
46    alt((
47      parse_uri_line,
48      parse_time_line,
49      parse_bandwidth_line,
50      parse_connection_name,
51      parse_email_line,
52      parse_phone_line,
53      parse_information_line
54    ))(input)
55}
56
57pub fn parse_optional_attributes(input: &[u8]) -> ParserResult<Vec<SdpOptionalAttribute>> {
58    let mut output = vec![];
59    let mut data = input;
60    while let Ok((remains, attribute)) = parse_optional_sdp_attribute(data) {
61        output.push(attribute);
62        data = remains;
63    }
64    Ok((data, output))
65}