use super::error::{BuilderError, BuilderResult, DurationExt};
use crate::time::{BreakDuration, SpliceTime};
use std::time::Duration;
#[derive(Debug)]
pub struct SpliceTimeBuilder {
pts_time: Option<Duration>,
}
impl SpliceTimeBuilder {
pub fn new() -> Self {
Self { pts_time: None }
}
pub fn immediate(mut self) -> Self {
self.pts_time = None;
self
}
pub fn at_pts(mut self, pts_time: Duration) -> BuilderResult<Self> {
self.pts_time = Some(pts_time);
Ok(self)
}
pub fn build(self) -> BuilderResult<SpliceTime> {
let pts_time = match self.pts_time {
Some(duration) => {
let ticks = duration.to_pts_ticks();
if ticks > 0x1_FFFF_FFFF {
return Err(BuilderError::DurationTooLarge {
field: "pts_time",
duration,
});
}
Some(ticks)
}
None => None,
};
Ok(SpliceTime {
time_specified_flag: pts_time.is_some() as u8,
pts_time,
})
}
}
impl Default for SpliceTimeBuilder {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug)]
pub struct BreakDurationBuilder {
duration: Duration,
auto_return: bool,
}
impl BreakDurationBuilder {
pub fn new(duration: Duration) -> Self {
Self {
duration,
auto_return: true,
}
}
pub fn auto_return(mut self, auto_return: bool) -> Self {
self.auto_return = auto_return;
self
}
pub fn build(self) -> BuilderResult<BreakDuration> {
let ticks = self.duration.to_pts_ticks();
if ticks > 0x1_FFFF_FFFF {
return Err(BuilderError::DurationTooLarge {
field: "duration",
duration: self.duration,
});
}
Ok(BreakDuration {
auto_return: self.auto_return as u8,
reserved: 0,
duration: ticks,
})
}
}