use core::{str::FromStr, time::Duration};
use derive_more::{Display, From, Into, IsVariant, TryUnwrap, Unwrap};
use crate::{
error::ParseHourError,
types::{Entry as GenericEntry, *},
utils::u64_digits,
};
pub type Cue<'a, T> = GenericEntry<Header<'a>, T>;
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, From, Into)]
#[repr(transparent)]
pub struct Hour(pub(crate) u64);
impl FromStr for Hour {
type Err = ParseHourError;
#[inline]
fn from_str(s: &str) -> Result<Self, Self::Err> {
Ok(Self(match s {
"0" => 0,
"1" => 1,
"2" => 2,
"3" => 3,
"4" => 4,
"5" => 5,
"6" => 6,
"7" => 7,
"8" => 8,
"9" => 9,
"00" => 0,
"01" => 1,
"02" => 2,
"03" => 3,
"04" => 4,
"05" => 5,
"06" => 6,
"07" => 7,
"08" => 8,
"09" => 9,
_ => return s.parse::<u64>().map(Self).map_err(Into::into),
}))
}
}
impl Hour {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn new() -> Self {
Self(0)
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with(value: u64) -> Self {
Self(value)
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn as_u64(&self) -> u64 {
self.0
}
}
impl core::fmt::Display for Hour {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
if self.0 < 10 {
write!(f, "0{}", self.0)
} else {
write!(f, "{}", self.0)
}
}
}
#[derive(Debug, Display, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[display("{}", self.encode().as_str())]
pub struct Timestamp {
hours: Hour,
millis: Millisecond,
minutes: Minute,
seconds: Second,
}
impl Default for Timestamp {
#[cfg_attr(not(tarpaulin), inline(always))]
fn default() -> Self {
Self::new()
}
}
impl Timestamp {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn new() -> Self {
Self::from_hmsm(Hour::new(), Minute(0), Second(0), Millisecond(0))
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn from_hmsm(
hours: Hour,
minutes: Minute,
seconds: Second,
millis: Millisecond,
) -> Self {
Self {
hours,
minutes,
seconds,
millis,
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn hours(&self) -> Hour {
self.hours
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn minutes(&self) -> Minute {
self.minutes
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn seconds(&self) -> Second {
self.seconds
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn millis(&self) -> Millisecond {
self.millis
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_hours(mut self, hours: Hour) -> Self {
self.set_hours(hours);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_minutes(mut self, minutes: Minute) -> Self {
self.set_minutes(minutes);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_seconds(mut self, seconds: Second) -> Self {
self.set_seconds(seconds);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_millis(mut self, millis: Millisecond) -> Self {
self.set_millis(millis);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_hours(&mut self, hours: Hour) -> &mut Self {
self.hours = hours;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_minutes(&mut self, minutes: Minute) -> &mut Self {
self.minutes = minutes;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_seconds(&mut self, seconds: Second) -> &mut Self {
self.seconds = seconds;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_millis(&mut self, millis: Millisecond) -> &mut Self {
self.millis = millis;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_hmsm(
&mut self,
hours: Hour,
minutes: Minute,
seconds: Second,
millis: Millisecond,
) -> &mut Self {
self.hours = hours;
self.minutes = minutes;
self.seconds = seconds;
self.millis = millis;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn to_duration(&self) -> Duration {
let minutes = self.minutes.0 as u64;
let seconds = self.seconds.0 as u64;
let millis = self.millis.0 as u64;
Duration::from_millis(
self.hours().as_u64() * 3_600_000 + minutes * 60_000 + seconds * 1_000 + millis,
)
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn encoded_len(&self) -> usize {
let base = self.minutes().as_str().len() + 1 + self.seconds().as_str().len() + 1 + self.millis().as_str().len(); if self.hours.0 == 0 {
base
} else {
let digits = u64_digits(self.hours.as_u64());
let hours_len = if digits < 2 { 2 } else { digits };
hours_len + 1 + base }
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn encode(&self) -> Buffer<31> {
let mut buffer = Buffer::new();
if self.hours.0 != 0 {
if self.hours.0 < 10 {
buffer.write_str("0");
}
buffer.fmt_u64(self.hours.0);
buffer.write_str(":");
}
buffer.write_str(self.minutes().as_str());
buffer.write_str(":");
buffer.write_str(self.seconds().as_str());
buffer.write_str(".");
buffer.write_str(self.millis().as_str());
buffer
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Header<'a> {
identifier: Option<CueId<'a>>,
start: Timestamp,
end: Timestamp,
settings: Option<CueOptions<'a>>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display)]
#[display("{_0}")]
#[repr(transparent)]
pub struct CueId<'a>(&'a str);
impl<'a> CueId<'a> {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn new(s: &'a str) -> Self {
Self(s)
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn as_str(&self) -> &'a str {
self.0
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct CueOptions<'a> {
vertical: Option<Vertical>,
line: Option<Line>,
position: Option<Position>,
size: Option<Size>,
align: Option<Align>,
region: Option<RegionId<'a>>,
}
impl<'a> CueOptions<'a> {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn vertical(&self) -> Option<Vertical> {
self.vertical
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_vertical(mut self, vertical: Vertical) -> Self {
self.vertical = Some(vertical);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_vertical(&mut self, vertical: Vertical) -> &mut Self {
self.vertical = Some(vertical);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn maybe_vertical(mut self, vertical: Option<Vertical>) -> Self {
self.vertical = vertical;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn update_vertical(&mut self, vertical: Option<Vertical>) -> &mut Self {
self.vertical = vertical;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn line(&self) -> Option<&Line> {
self.line.as_ref()
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_line(mut self, line: Line) -> Self {
self.line = Some(line);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_line(&mut self, line: Line) -> &mut Self {
self.line = Some(line);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn maybe_line(mut self, line: Option<Line>) -> Self {
self.line = line;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn update_line(&mut self, line: Option<Line>) -> &mut Self {
self.line = line;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn position(&self) -> Option<&Position> {
self.position.as_ref()
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_position(mut self, position: Position) -> Self {
self.position = Some(position);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_position(&mut self, position: Position) -> &mut Self {
self.position = Some(position);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn maybe_position(mut self, position: Option<Position>) -> Self {
self.position = position;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn update_position(&mut self, position: Option<Position>) -> &mut Self {
self.position = position;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn size(&self) -> Option<Size> {
self.size
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_size(mut self, size: Size) -> Self {
self.size = Some(size);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_size(&mut self, size: Size) -> &mut Self {
self.size = Some(size);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn maybe_size(mut self, size: Option<Size>) -> Self {
self.size = size;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn update_size(&mut self, size: Option<Size>) -> &mut Self {
self.size = size;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn align(&self) -> Option<Align> {
self.align
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_align(mut self, align: Align) -> Self {
self.align = Some(align);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_align(&mut self, align: Align) -> &mut Self {
self.align = Some(align);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn maybe_align(mut self, align: Option<Align>) -> Self {
self.align = align;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn update_align(&mut self, align: Option<Align>) -> &mut Self {
self.align = align;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn region(&self) -> Option<&RegionId<'a>> {
self.region.as_ref()
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn with_region(mut self, region: RegionId<'a>) -> Self {
self.region = Some(region);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_region(&mut self, region: RegionId<'a>) -> &mut Self {
self.region = Some(region);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn maybe_region(mut self, region: Option<RegionId<'a>>) -> Self {
self.region = region;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn update_region(&mut self, region: Option<RegionId<'a>>) -> &mut Self {
self.region = region;
self
}
}
#[derive(Debug, Display, Clone, Copy, PartialEq, Eq, Hash, IsVariant)]
pub enum Vertical {
#[display("rl")]
Rl,
#[display("lr")]
Lr,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Into)]
#[repr(transparent)]
pub struct Percentage(f64);
impl Eq for Percentage {}
impl core::hash::Hash for Percentage {
fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
self.0.to_bits().hash(state);
}
}
impl PartialOrd for Percentage {
#[cfg_attr(not(tarpaulin), inline(always))]
fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
Some(self.cmp(other))
}
}
impl Ord for Percentage {
#[cfg_attr(not(tarpaulin), inline(always))]
fn cmp(&self, other: &Self) -> core::cmp::Ordering {
self.0.total_cmp(&other.0)
}
}
impl core::fmt::Display for Percentage {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
if self.0 == (self.0 as i64) as f64 {
write!(f, "{}", self.0 as i64)
} else {
write!(f, "{}", self.0)
}
}
}
impl Percentage {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn new() -> Self {
Self(0.0)
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn with(value: f64) -> Self {
assert!(
(0.0..=100.0).contains(&value),
"Percentage value must be between 0.0 and 100.0"
);
Self(value)
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn try_with(value: f64) -> Option<Self> {
if (0.0..=100.0).contains(&value) {
Some(Self(value))
} else {
None
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn value(&self) -> f64 {
self.0
}
}
#[derive(Debug, Display, Clone, Copy, PartialEq, Eq, Hash, IsVariant, Unwrap, TryUnwrap)]
#[unwrap(ref, ref_mut)]
#[try_unwrap(ref, ref_mut)]
pub enum LineValue {
#[display("{_0}%")]
Percentage(Percentage),
#[display("{_0}")]
Number(i32),
}
#[derive(Debug, Display, Clone, Copy, PartialEq, Eq, Hash, IsVariant)]
pub enum LineAlign {
#[display("start")]
Start,
#[display("center")]
Center,
#[display("end")]
End,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Line {
value: LineValue,
alignment: Option<LineAlign>,
}
impl Line {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn new(value: LineValue) -> Self {
Self {
value,
alignment: None,
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_alignment(value: LineValue, alignment: LineAlign) -> Self {
Self {
value,
alignment: Some(alignment),
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn value(&self) -> LineValue {
self.value
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_value(&mut self, value: LineValue) -> &mut Self {
self.value = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn alignment(&self) -> Option<LineAlign> {
self.alignment
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_alignment(&mut self, alignment: LineAlign) -> &mut Self {
self.alignment = Some(alignment);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn maybe_alignment(mut self, alignment: Option<LineAlign>) -> Self {
self.alignment = alignment;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn update_alignment(&mut self, alignment: Option<LineAlign>) -> &mut Self {
self.alignment = alignment;
self
}
}
#[derive(Debug, Display, Clone, Copy, PartialEq, Eq, Hash, IsVariant)]
pub enum PositionAlign {
#[display("line-left")]
LineLeft,
#[display("center")]
Center,
#[display("line-right")]
LineRight,
#[display("auto")]
Auto,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Position {
value: Percentage,
alignment: Option<PositionAlign>,
}
impl Position {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn new(value: Percentage) -> Self {
Self {
value,
alignment: None,
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_alignment(value: Percentage, alignment: PositionAlign) -> Self {
Self {
value,
alignment: Some(alignment),
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn value(&self) -> Percentage {
self.value
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_value(&mut self, value: Percentage) -> &mut Self {
self.value = value;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn alignment(&self) -> Option<PositionAlign> {
self.alignment
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_alignment(&mut self, alignment: PositionAlign) -> &mut Self {
self.alignment = Some(alignment);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn maybe_alignment(mut self, alignment: Option<PositionAlign>) -> Self {
self.alignment = alignment;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn update_alignment(&mut self, alignment: Option<PositionAlign>) -> &mut Self {
self.alignment = alignment;
self
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Size(Percentage);
impl Size {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn new(value: Percentage) -> Self {
Self(value)
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn value(&self) -> Percentage {
self.0
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_value(&mut self, value: Percentage) -> &mut Self {
self.0 = value;
self
}
}
#[derive(Debug, Display, Clone, Copy, PartialEq, Eq, Hash, IsVariant)]
pub enum Align {
#[display("start")]
Start,
#[display("center")]
Center,
#[display("end")]
End,
#[display("left")]
Left,
#[display("right")]
Right,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display)]
#[display("{_0}")]
#[repr(transparent)]
pub struct RegionId<'a>(&'a str);
impl<'a> RegionId<'a> {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn new(s: &'a str) -> Self {
Self(s)
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn as_str(&self) -> &'a str {
self.0
}
}
#[derive(Debug, Default, Display, Clone, Copy, PartialEq, Eq, Hash, IsVariant)]
pub enum Scroll {
#[display("none")]
#[default]
None,
#[display("up")]
Up,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Anchor {
x: Percentage,
y: Percentage,
}
impl Anchor {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn new(x: Percentage, y: Percentage) -> Self {
Self { x, y }
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn x(&self) -> Percentage {
self.x
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn y(&self) -> Percentage {
self.y
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Region<'a> {
id: RegionId<'a>,
width: Percentage,
lines: u32,
region_anchor: Anchor,
viewport_anchor: Anchor,
scroll: Scroll,
}
impl Default for Region<'_> {
fn default() -> Self {
Self::new(RegionId::new(""))
}
}
impl<'a> Region<'a> {
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn new(id: RegionId<'a>) -> Self {
Self {
id,
width: Percentage::with(100.0),
lines: 3,
region_anchor: Anchor::new(Percentage::new(), Percentage::with(100.0)),
viewport_anchor: Anchor::new(Percentage::new(), Percentage::with(100.0)),
scroll: Scroll::None,
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn id(&self) -> RegionId<'a> {
self.id
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_id(&mut self, id: RegionId<'a>) -> &mut Self {
self.id = id;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn width(&self) -> Percentage {
self.width
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn with_width(mut self, width: Percentage) -> Self {
self.width = width;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_width(&mut self, width: Percentage) -> &mut Self {
self.width = width;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn lines(&self) -> u32 {
self.lines
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_lines(mut self, lines: u32) -> Self {
self.lines = lines;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_lines(&mut self, lines: u32) -> &mut Self {
self.lines = lines;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn region_anchor(&self) -> Anchor {
self.region_anchor
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn with_region_anchor(mut self, anchor: Anchor) -> Self {
self.region_anchor = anchor;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_region_anchor(&mut self, anchor: Anchor) -> &mut Self {
self.region_anchor = anchor;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn viewport_anchor(&self) -> Anchor {
self.viewport_anchor
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn with_viewport_anchor(mut self, anchor: Anchor) -> Self {
self.viewport_anchor = anchor;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_viewport_anchor(&mut self, anchor: Anchor) -> &mut Self {
self.viewport_anchor = anchor;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn scroll(&self) -> Scroll {
self.scroll
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_scroll(mut self, scroll: Scroll) -> Self {
self.scroll = scroll;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_scroll(&mut self, scroll: Scroll) -> &mut Self {
self.scroll = scroll;
self
}
}
impl<'a> Header<'a> {
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn new(start: Timestamp, end: Timestamp) -> Self {
Self {
identifier: None,
start,
end,
settings: None,
}
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn identifier(&self) -> Option<&CueId<'a>> {
self.identifier.as_ref()
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn with_identifier(mut self, id: CueId<'a>) -> Self {
self.identifier = Some(id);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_identifier(&mut self, id: CueId<'a>) -> &mut Self {
self.identifier = Some(id);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn maybe_identifier(mut self, id: Option<CueId<'a>>) -> Self {
self.identifier = id;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn update_identifier(&mut self, id: Option<CueId<'a>>) -> &mut Self {
self.identifier = id;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn start(&self) -> Timestamp {
self.start
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_start(mut self, start: Timestamp) -> Self {
self.start = start;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_start(&mut self, start: Timestamp) -> &mut Self {
self.start = start;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn end(&self) -> Timestamp {
self.end
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn with_end(mut self, end: Timestamp) -> Self {
self.end = end;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn set_end(&mut self, end: Timestamp) -> &mut Self {
self.end = end;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub const fn settings(&self) -> Option<&CueOptions<'a>> {
self.settings.as_ref()
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn with_settings(mut self, settings: CueOptions<'a>) -> Self {
self.settings = Some(settings);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_settings(&mut self, settings: CueOptions<'a>) -> &mut Self {
self.settings = Some(settings);
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn maybe_settings(mut self, settings: Option<CueOptions<'a>>) -> Self {
self.settings = settings;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn update_settings(&mut self, settings: Option<CueOptions<'a>>) -> &mut Self {
self.settings = settings;
self
}
}
#[derive(Debug, Clone, PartialEq, Eq, IsVariant, Unwrap, TryUnwrap)]
#[unwrap(ref, ref_mut)]
#[try_unwrap(ref, ref_mut)]
pub enum Block<'a, T> {
Cue(Cue<'a, T>),
Note(T),
Style(T),
Region(Region<'a>),
}