dawproject_rs/api/
project.rs

1#![allow(unused)]
2
3use {
4    super::{
5        application::Application, arrangement::Arrangement, fake_rng, mixer_role::MixerRoleEnum,
6        scene::Scene,
7    },
8    fake::{Dummy, Fake, Faker},
9};
10
11use super::transport::Transport;
12
13use super::{channel::Channel, track::Track};
14
15use serde::{Deserialize, Serialize};
16
17#[derive(Debug, Deserialize, Serialize, Clone, Dummy)]
18pub enum TrackChannelEnum {
19    Track(Track),
20    Channel(Channel),
21}
22
23#[derive(Debug, Deserialize, Serialize, Clone, Dummy)]
24pub struct Structure {
25    #[serde(rename = "$value", default)]
26    pub sequence: Vec<TrackChannelEnum>,
27}
28
29#[derive(Debug, Deserialize, Serialize, Clone, Dummy)]
30pub struct Project {
31    #[serde(rename = "@version")]
32    pub version: String, // assign 1.0
33    #[serde(rename = "Application")]
34    pub application: Application,
35    #[serde(rename = "Transport")]
36    #[serde(skip_serializing_if = "Option::is_none")]
37    pub transport: Option<Transport>,
38    #[serde(rename = "Structure")]
39    #[serde(skip_serializing_if = "Option::is_none")]
40    pub structure: Option<Structure>,
41    #[serde(rename = "Arrangement")]
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub arrangement: Option<Arrangement>,
44    #[serde(rename = "Scenes")]
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub scenes: Option<Vec<Scene>>,
47}
48
49impl Structure {
50    pub fn new_empty() -> Self {
51        Structure {
52            sequence: Vec::new(),
53        }
54    }
55}
56
57impl Project {
58    pub fn new_test(name: String, version: f64) -> Self {
59        Project {
60            version: "1.0".to_string(),
61            application: Application::new_name_ver(name, version),
62            transport: None,
63            structure: Some(Structure { sequence: vec![] }),
64            arrangement: Some(Arrangement::new_fake()),
65            scenes: None,
66        }
67    }
68
69    pub fn new_fake() -> Self {
70        let o: Self = Faker.fake_with_rng(&mut fake_rng());
71        o
72    }
73
74    pub fn get_master_track(&self) -> Option<&Track> {
75        if let Some(TrackChannelEnum::Track(t)) = self
76            .structure
77            .as_ref()
78            .unwrap()
79            .sequence
80            .iter()
81            .find(|el| match el {
82                TrackChannelEnum::Track(t) => {
83                    t.track_channel
84                        .iter()
85                        .filter(|el| match el {
86                            TrackChannelEnum::Channel(c) => {
87                                if c.role.is_some() {
88                                    *c.role.as_ref().unwrap() == MixerRoleEnum::Master
89                                } else {
90                                    false
91                                }
92                            }
93                            _ => false,
94                        })
95                        .count()
96                        != 0
97                }
98                TrackChannelEnum::Channel(_) => false,
99            })
100        {
101            return Some(t);
102        }
103        None
104    }
105}
106
107#[cfg(test)]
108mod tests {
109    use {super::Project, quick_xml::se::to_string, std::error::Error};
110
111    #[test]
112    pub fn se_test() -> Result<(), Box<dyn Error>> {
113        let mut o = Project::new_fake();
114
115        match to_string(&o) {
116            Ok(o) => println!("{}", o),
117            Err(err) => return Err(err.into()),
118        }
119
120        Ok(())
121    }
122}