use crate::{MAX_TEXT_CONTENT_BYTES, TextStyle};
use alpha2_time::TimeRange;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(deny_unknown_fields)]
pub struct Captions {
#[serde(default)]
pub style: TextStyle,
pub cues: Vec<CaptionCue>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(deny_unknown_fields)]
pub struct CaptionCue {
pub timeline_range: TimeRange,
pub text: String,
}
pub const MAX_CAPTION_FONT_SIZE: f32 = 0.25;
impl Captions {
pub(crate) fn is_valid(&self) -> bool {
self.style.is_valid(MAX_CAPTION_FONT_SIZE)
&& self.cues.iter().all(|cue| {
!cue.timeline_range.is_empty()
&& cue.timeline_range.start().ticks() >= 0
&& !cue.text.is_empty()
&& cue.text.len() <= MAX_TEXT_CONTENT_BYTES
})
&& self
.cues
.windows(2)
.all(|pair| pair[0].timeline_range.end() <= pair[1].timeline_range.start())
}
}