dawproject_rs/api/
track.rs

1#![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    // Extends lane
19    #[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}