"type": "string"
}
},
- "time": {
- "type": "string",
- "optional": true,
- "description": "Start and stop times for a session"
- },
- "repeat_time": {
- "type": "string",
- "optional": true,
- "description": "Specify repeat times for a session"
+ "time_descriptions": {
+ "type": "array",
+ "description": "A list of time descriptions for a session",
+ "minItems": 1,
+ "items": {
+ "type": "object",
+ "optional": true,
+ "properties": {
+ "time": {
+ "type": "string",
+ "optional": true,
+ "description": "Start and stop times for a session"
+ },
+ "repeat_time": {
+ "type": "string",
+ "optional": true,
+ "description": "Specify repeat times for a session"
+ }
+ },
+ "additionalProperties": false
+ }
},
"timezone": {
"type": "string",
use crate::jsonbuilder::{JsonBuilder, JsonError};
-use super::parser::{MediaDescription, SdpMessage};
+use super::parser::{MediaDescription, SdpMessage, TimeDescription};
pub fn sdp_log(msg: &SdpMessage, js: &mut JsonBuilder) -> Result<(), JsonError> {
js.open_object("sdp")?;
if let Some(bws) = &msg.bandwidths {
log_bandwidth(bws, js)?;
}
- js.set_string("time", &msg.time)?;
- if let Some(repeat_time) = &msg.repeat_time {
- js.set_string("repeat_time", repeat_time)?;
- }
+ log_time_description(&msg.time_description, js)?;
if let Some(tz) = &msg.time_zone {
js.set_string("timezone", tz)?;
}
Ok(())
}
+fn log_time_description(
+ time: &Vec<TimeDescription>, js: &mut JsonBuilder,
+) -> Result<(), JsonError> {
+ js.open_array("time_descriptions")?;
+ for t in time {
+ js.start_object()?;
+ js.set_string("time", &t.time)?;
+ if let Some(repeat_time) = &t.repeat_time {
+ js.set_string("repeat_time", repeat_time)?;
+ }
+ js.close()?;
+ }
+ js.close()?;
+ Ok(())
+}
+
fn log_media_description(
media: &Vec<MediaDescription>, js: &mut JsonBuilder,
) -> Result<(), JsonError> {
pub phone_number: Option<String>,
pub connection_data: Option<String>,
pub bandwidths: Option<Vec<String>>,
- pub time: String,
- pub repeat_time: Option<String>,
+ pub time_description: Vec<TimeDescription>,
pub time_zone: Option<String>,
pub encryption_key: Option<String>,
pub attributes: Option<Vec<String>>,
pub attributes: Option<Vec<String>>,
}
+#[derive(Debug)]
+pub struct TimeDescription {
+ pub time: String,
+ pub repeat_time: Option<String>,
+}
+
// token-char = %x21 / %x23-27 / %x2A-2B / %x2D-2E / %x30-39 / %x41-5A / %x5E-7E
#[inline]
fn is_token_char(b: u8) -> bool {
let (i, phone_number) = opt(parse_phone_number)(i)?;
let (i, connection_data) = opt(parse_connection_data)(i)?;
let (i, bandwidths) = opt(parse_bandwidth)(i)?;
- let (i, time) = parse_time(i)?;
- let (i, repeat_time) = opt(parse_repeat_times)(i)?;
+ let (i, time_description) = many1(parse_time_description)(i)?;
let (i, time_zone) = opt(parse_time_zone)(i)?;
let (i, encryption_key) = opt(parse_encryption_key)(i)?;
let (i, attributes) = opt(parse_attributes)(i)?;
phone_number,
connection_data,
bandwidths,
- time,
- repeat_time,
+ time_description,
time_zone,
encryption_key,
attributes,
Ok((i, vec))
}
+fn parse_time_description(i: &[u8]) -> IResult<&[u8], TimeDescription> {
+ let (i, time) = parse_time(i)?;
+ let (i, repeat_time) = opt(parse_repeat_times)(i)?;
+ Ok((i, TimeDescription { time, repeat_time }))
+}
+
fn parse_time(i: &[u8]) -> IResult<&[u8], String> {
let (i, (start_time, _, stop_time)) = preceded(
tag("t="),