timecode/
timecode_frames.rs

1pub use frame_rate::FrameRate;
2use std::fmt::Display;
3
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Deserialize, Clone, PartialEq, Serialize)]
7pub struct TimecodeFrames {
8  frame_rate: FrameRate,
9  number_of_frames: u8,
10  drop_frame: bool,
11  color_frame: bool,
12}
13
14impl TimecodeFrames {
15  pub fn new(
16    frame_rate: FrameRate,
17    number_of_frames: u8,
18    drop_frame: bool,
19    color_frame: bool,
20  ) -> Self {
21    Self {
22      frame_rate,
23      number_of_frames,
24      drop_frame,
25      color_frame,
26    }
27  }
28
29  pub fn frame_rate(&self) -> FrameRate {
30    self.frame_rate
31  }
32
33  pub fn number_of_frames(&self) -> u8 {
34    self.number_of_frames
35  }
36
37  pub fn drop_frame(&self) -> bool {
38    self.drop_frame
39  }
40
41  pub fn color_frame(&self) -> bool {
42    self.color_frame
43  }
44
45  pub fn number_of_digits(&self) -> usize {
46    2
47  }
48
49  pub fn separator(&self) -> char {
50    if self.drop_frame() {
51      ';'
52    } else {
53      ':'
54    }
55  }
56}
57
58impl Display for TimecodeFrames {
59  fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
60    let separator = if self.drop_frame() { ';' } else { ':' };
61
62    write!(f, "{}{:02}", separator, self.number_of_frames())
63  }
64}