libsdp/attributes/
optional.rs1use 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}