dawproject_rs/api/
project.rs1#![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, #[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}