Fixed fmt

This commit is contained in:
Juan Moreno 2024-05-21 15:12:16 -05:00
parent d0b089f177
commit 0a1f1fd703
3 changed files with 40 additions and 26 deletions

View file

@ -521,7 +521,6 @@ enum SegmentTag {
Part(Part), Part(Part),
} }
fn media_segment_tag(i: &[u8]) -> IResult<&[u8], SegmentTag> { fn media_segment_tag(i: &[u8]) -> IResult<&[u8], SegmentTag> {
alt(( alt((
map( map(
@ -813,7 +812,6 @@ fn unquoted_from_utf8_slice(s: &[u8]) -> Result<QuotedOrUnquoted, string::FromUt
} }
} }
// Low latency HLS parsers // Low latency HLS parsers
fn server_control_tag(i: &[u8]) -> IResult<&[u8], ServerControl> { fn server_control_tag(i: &[u8]) -> IResult<&[u8], ServerControl> {
@ -837,7 +835,6 @@ fn part_tag(i: &[u8]) -> IResult<&[u8], Part> {
)(i) )(i)
} }
fn skip_tag(i: &[u8]) -> IResult<&[u8], Skip> { fn skip_tag(i: &[u8]) -> IResult<&[u8], Skip> {
map_res( map_res(
pair(tag("#EXT-X-SKIP:"), key_value_pairs), pair(tag("#EXT-X-SKIP:"), key_value_pairs),
@ -859,7 +856,6 @@ fn rendition_report_tag(i: &[u8]) -> IResult<&[u8], RenditionReport> {
)(i) )(i)
} }
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;

View file

@ -875,7 +875,6 @@ pub struct MediaSegment {
/// `#EXT-` /// `#EXT-`
pub unknown_tags: Vec<ExtTag>, pub unknown_tags: Vec<ExtTag>,
// LL-HLS specific fields // LL-HLS specific fields
pub parts: Vec<Part>, pub parts: Vec<Part>,
} }
@ -1082,7 +1081,6 @@ impl ByteRange {
} }
} }
impl Display for ByteRange { impl Display for ByteRange {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.length)?; write!(f, "{}", self.length)?;
@ -1105,13 +1103,15 @@ impl FromStr for ByteRange {
.map_err(|err| format!("Failed to parse length in BYTERANGE: {}", err))?; .map_err(|err| format!("Failed to parse length in BYTERANGE: {}", err))?;
let offset = parts let offset = parts
.next() .next()
.map(|o| o.parse::<u64>().map_err(|err| format!("Failed to parse offset in BYTERANGE: {}", err))) .map(|o| {
o.parse::<u64>()
.map_err(|err| format!("Failed to parse offset in BYTERANGE: {}", err))
})
.transpose()?; .transpose()?;
Ok(ByteRange { length, offset }) Ok(ByteRange { length, offset })
} }
} }
/// [`#EXT-X-DATERANGE:<attribute-list>`](https://tools.ietf.org/html/draft-pantos-http-live-streaming-19#section-4.3.2.7) /// [`#EXT-X-DATERANGE:<attribute-list>`](https://tools.ietf.org/html/draft-pantos-http-live-streaming-19#section-4.3.2.7)
/// ///
/// The EXT-X-DATERANGE tag associates a Date Range (i.e. a range of time /// The EXT-X-DATERANGE tag associates a Date Range (i.e. a range of time
@ -1208,7 +1208,6 @@ impl DateRange {
} }
} }
// Implementing structs for LL-HLS // Implementing structs for LL-HLS
#[derive(Debug, Default, PartialEq, Clone)] #[derive(Debug, Default, PartialEq, Clone)]
pub struct ServerControl { pub struct ServerControl {
@ -1219,7 +1218,9 @@ pub struct ServerControl {
} }
impl ServerControl { impl ServerControl {
pub(crate) fn from_hashmap(mut attrs: HashMap<String, QuotedOrUnquoted>) -> Result<ServerControl, String> { pub(crate) fn from_hashmap(
mut attrs: HashMap<String, QuotedOrUnquoted>,
) -> Result<ServerControl, String> {
let can_skip_until = unquoted_string_parse!(attrs, "CAN-SKIP-UNTIL", |s: &str| s let can_skip_until = unquoted_string_parse!(attrs, "CAN-SKIP-UNTIL", |s: &str| s
.parse::<f64>() .parse::<f64>()
.map_err(|err| format!("Failed to parse CAN-SKIP-UNTIL attribute: {}", err))); .map_err(|err| format!("Failed to parse CAN-SKIP-UNTIL attribute: {}", err)));
@ -1257,11 +1258,13 @@ pub struct PartInf {
} }
impl PartInf { impl PartInf {
pub(crate) fn from_hashmap(mut attrs: HashMap<String, QuotedOrUnquoted>) -> Result<PartInf, String> { pub(crate) fn from_hashmap(
mut attrs: HashMap<String, QuotedOrUnquoted>,
) -> Result<PartInf, String> {
let part_target = unquoted_string_parse!(attrs, "PART-TARGET", |s: &str| s let part_target = unquoted_string_parse!(attrs, "PART-TARGET", |s: &str| s
.parse::<f64>() .parse::<f64>()
.map_err(|err| format!("Failed to parse PART-TARGET attribute: {}", err))) .map_err(|err| format!("Failed to parse PART-TARGET attribute: {}", err)))
.ok_or_else(|| String::from("EXT-X-PART-INF without mandatory PART-TARGET attribute"))?; .ok_or_else(|| String::from("EXT-X-PART-INF without mandatory PART-TARGET attribute"))?;
Ok(PartInf { part_target }) Ok(PartInf { part_target })
} }
@ -1282,12 +1285,14 @@ pub struct Part {
} }
impl Part { impl Part {
pub(crate) fn from_hashmap(mut attrs: HashMap<String, QuotedOrUnquoted>) -> Result<Part, String> { pub(crate) fn from_hashmap(
mut attrs: HashMap<String, QuotedOrUnquoted>,
) -> Result<Part, String> {
let uri = quoted_string!(attrs, "URI").unwrap_or_default(); let uri = quoted_string!(attrs, "URI").unwrap_or_default();
let duration = unquoted_string_parse!(attrs, "DURATION", |s: &str| s let duration = unquoted_string_parse!(attrs, "DURATION", |s: &str| s
.parse::<f64>() .parse::<f64>()
.map_err(|err| format!("Failed to parse DURATION attribute: {}", err))) .map_err(|err| format!("Failed to parse DURATION attribute: {}", err)))
.ok_or_else(|| String::from("EXT-X-PART without mandatory DURATION attribute"))?; .ok_or_else(|| String::from("EXT-X-PART without mandatory DURATION attribute"))?;
let independent = is_yes!(attrs, "INDEPENDENT"); let independent = is_yes!(attrs, "INDEPENDENT");
let gap = is_yes!(attrs, "GAP"); let gap = is_yes!(attrs, "GAP");
let byte_range = quoted_string_parse!(attrs, "BYTERANGE", |s: &str| s.parse::<ByteRange>()); let byte_range = quoted_string_parse!(attrs, "BYTERANGE", |s: &str| s.parse::<ByteRange>());
@ -1302,7 +1307,11 @@ impl Part {
} }
pub(crate) fn write_to<T: Write>(&self, w: &mut T) -> std::io::Result<()> { pub(crate) fn write_to<T: Write>(&self, w: &mut T) -> std::io::Result<()> {
write!(w, "#EXT-X-PART:URI=\"{}\",DURATION={}", self.uri, self.duration)?; write!(
w,
"#EXT-X-PART:URI=\"{}\",DURATION={}",
self.uri, self.duration
)?;
if self.independent { if self.independent {
write!(w, ",INDEPENDENT=YES")?; write!(w, ",INDEPENDENT=YES")?;
} }
@ -1324,11 +1333,13 @@ pub struct Skip {
} }
impl Skip { impl Skip {
pub(crate) fn from_hashmap(mut attrs: HashMap<String, QuotedOrUnquoted>) -> Result<Skip, String> { pub(crate) fn from_hashmap(
mut attrs: HashMap<String, QuotedOrUnquoted>,
) -> Result<Skip, String> {
let skipped_segments = unquoted_string_parse!(attrs, "SKIPPED-SEGMENTS", |s: &str| s let skipped_segments = unquoted_string_parse!(attrs, "SKIPPED-SEGMENTS", |s: &str| s
.parse::<u64>() .parse::<u64>()
.map_err(|err| format!("Failed to parse SKIPPED-SEGMENTS attribute: {}", err))) .map_err(|err| format!("Failed to parse SKIPPED-SEGMENTS attribute: {}", err)))
.ok_or_else(|| String::from("EXT-X-SKIP without mandatory SKIPPED-SEGMENTS attribute"))?; .ok_or_else(|| String::from("EXT-X-SKIP without mandatory SKIPPED-SEGMENTS attribute"))?;
Ok(Skip { skipped_segments }) Ok(Skip { skipped_segments })
} }
@ -1347,7 +1358,9 @@ pub struct PreloadHint {
} }
impl PreloadHint { impl PreloadHint {
pub(crate) fn from_hashmap(mut attrs: HashMap<String, QuotedOrUnquoted>) -> Result<PreloadHint, String> { pub(crate) fn from_hashmap(
mut attrs: HashMap<String, QuotedOrUnquoted>,
) -> Result<PreloadHint, String> {
let hint_type = unquoted_string!(attrs, "TYPE") let hint_type = unquoted_string!(attrs, "TYPE")
.ok_or_else(|| String::from("EXT-X-PRELOAD-HINT without mandatory TYPE attribute"))?; .ok_or_else(|| String::from("EXT-X-PRELOAD-HINT without mandatory TYPE attribute"))?;
let uri = quoted_string!(attrs, "URI") let uri = quoted_string!(attrs, "URI")
@ -1361,7 +1374,11 @@ impl PreloadHint {
} }
pub(crate) fn write_to<T: Write>(&self, w: &mut T) -> std::io::Result<()> { pub(crate) fn write_to<T: Write>(&self, w: &mut T) -> std::io::Result<()> {
write!(w, "#EXT-X-PRELOAD-HINT:TYPE={},URI=\"{}\"", self.hint_type, self.uri)?; write!(
w,
"#EXT-X-PRELOAD-HINT:TYPE={},URI=\"{}\"",
self.hint_type, self.uri
)?;
if let Some(ref byte_range) = self.byte_range { if let Some(ref byte_range) = self.byte_range {
write!(w, ",BYTERANGE=\"")?; write!(w, ",BYTERANGE=\"")?;
byte_range.write_value_to(w)?; byte_range.write_value_to(w)?;
@ -1379,9 +1396,12 @@ pub struct RenditionReport {
} }
impl RenditionReport { impl RenditionReport {
pub(crate) fn from_hashmap(mut attrs: HashMap<String, QuotedOrUnquoted>) -> Result<RenditionReport, String> { pub(crate) fn from_hashmap(
let uri = quoted_string!(attrs, "URI") mut attrs: HashMap<String, QuotedOrUnquoted>,
.ok_or_else(|| String::from("EXT-X-RENDITION-REPORT without mandatory URI attribute"))?; ) -> Result<RenditionReport, String> {
let uri = quoted_string!(attrs, "URI").ok_or_else(|| {
String::from("EXT-X-RENDITION-REPORT without mandatory URI attribute")
})?;
let last_msn = unquoted_string_parse!(attrs, "LAST-MSN", |s: &str| s let last_msn = unquoted_string_parse!(attrs, "LAST-MSN", |s: &str| s
.parse::<u64>() .parse::<u64>()
.map_err(|err| format!("Failed to parse LAST-MSN attribute: {}", err))); .map_err(|err| format!("Failed to parse LAST-MSN attribute: {}", err)));

View file

@ -421,7 +421,7 @@ fn create_and_parse_media_playlist_full() {
part_inf: Default::default(), part_inf: Default::default(),
skip: Default::default(), skip: Default::default(),
preload_hint: Default::default(), preload_hint: Default::default(),
rendition_report: Default::default() rendition_report: Default::default(),
}); });
let playlist_parsed = print_create_and_parse_playlist(&mut playlist_original); let playlist_parsed = print_create_and_parse_playlist(&mut playlist_original);
assert_eq!(playlist_original, playlist_parsed); assert_eq!(playlist_original, playlist_parsed);
@ -569,9 +569,7 @@ fn create_and_parse_media_playlist_llhls() {
part_hold_back: Some(1.5), part_hold_back: Some(1.5),
can_block_reload: true, can_block_reload: true,
}), }),
part_inf: Some(PartInf { part_inf: Some(PartInf { part_target: 0.5 }),
part_target: 0.5,
}),
skip: Some(Skip { skip: Some(Skip {
skipped_segments: 3, skipped_segments: 3,
}), }),