dawproject_rs/api/
track.rs1#![allow(unused)]
2use super::add_one_get;
3
4use super::{mixer_role::MixerRoleEnum, project::TrackChannelEnum};
5
6use {
7 super::{channel::Channel, content_type::ContentType, fake_rng},
8 fake::{Dummy, Fake, Faker},
9 serde::{Deserialize, Serialize},
10};
11
12pub type TrackChannel = Vec<TrackChannelEnum>;
13
14type Content = Vec<ContentType>;
15
16#[derive(Debug, Deserialize, Serialize, Clone, Dummy)]
17pub struct Track {
18 #[serde(rename = "@id")]
20 #[serde(skip_serializing_if = "Option::is_none")]
21 id: Option<String>,
22 #[serde(rename = "@name")]
23 #[serde(skip_serializing_if = "Option::is_none")]
24 name: Option<String>,
25 #[serde(rename = "@color")]
26 #[serde(skip_serializing_if = "Option::is_none")]
27 pub color: Option<String>,
28 #[serde(rename = "@comment")]
29 #[serde(skip_serializing_if = "Option::is_none")]
30 comment: Option<String>,
31 #[serde(rename = "@contentType")]
32 content_type: Content,
33 #[serde(rename = "@loaded")]
34 #[serde(skip_serializing_if = "Option::is_none")]
35 loaded: Option<bool>,
36 #[serde(rename = "$value")]
37 pub track_channel: TrackChannel,
38}
39
40impl Track {
41 pub fn new_test(
42 name: String,
43 content_type: Vec<ContentType>,
44 mixer_role: MixerRoleEnum,
45 volume: f64,
46 pan: f64,
47 ) -> Track {
48 let channel = Channel::new_test(volume, pan, mixer_role);
49
50 Track {
51 id: Some(format!("id_{}", add_one_get())),
52 name: Some(name),
53 color: None,
54 comment: None,
55 track_channel: vec![TrackChannelEnum::Channel(channel)],
56 content_type,
57 loaded: Some(false),
58 }
59 }
60
61 pub fn new_fake() -> Self {
62 let o: Self = Faker.fake_with_rng(&mut fake_rng());
63 o
64 }
65
66 pub fn get_channel(&mut self) -> Option<&mut Channel> {
67 if let Some(TrackChannelEnum::Channel(c)) = self
68 .track_channel
69 .iter_mut()
70 .find(|el| matches!(el, TrackChannelEnum::Channel(_c)))
71 {
72 return Some(c);
73 }
74
75 None
76 }
77
78 pub fn get_id(&self) -> String {
79 self.id.clone().unwrap()
80 }
81}
82
83#[cfg(test)]
84mod tests {
85 use {super::*, quick_xml::se, std::error::Error};
86
87 #[test]
88 pub fn se_test() -> Result<(), Box<dyn Error>> {
89 let t = Track::new_test(
90 "Test".to_string(),
91 vec![ContentType::Audio],
92 MixerRoleEnum::Effect,
93 0.0,
94 0.0,
95 );
96
97 match se::to_string(&t) {
98 Ok(_) => return Ok(()),
99 Err(err) => return Err(err.into()),
100 }
101 }
102}