melodium_lang/semantic/
script.rs1use melodium_common::descriptor::Version;
4
5use super::common::Node;
6use super::model::Model;
7use super::r#use::Use;
8use super::treatment::Treatment;
9use crate::text::Script as TextScript;
10use crate::ScriptResult;
11use std::collections::HashMap;
12use std::sync::{Arc, RwLock};
13
14#[derive(Debug)]
20pub struct Script {
21 pub text: TextScript,
22
23 pub uses: Vec<Arc<RwLock<Use>>>,
24 pub models: HashMap<String, Arc<RwLock<Model>>>,
25 pub treatments: HashMap<String, Arc<RwLock<Treatment>>>,
26}
27
28impl Script {
29 pub fn new(text: TextScript, version: Version) -> ScriptResult<Arc<RwLock<Self>>> {
38 let script = Arc::<RwLock<Self>>::new(RwLock::new(Self {
39 text: text.clone(),
40 uses: Vec::new(),
41 models: HashMap::new(),
42 treatments: HashMap::new(),
43 }));
44 let mut result = ScriptResult::new_success(script.clone());
45
46 for u in text.uses {
47 if let Some(r#use) = result.merge_degrade_failure(Use::new(
48 Arc::clone(&script),
49 u.clone(),
50 version.clone(),
51 )) {
52 script.write().unwrap().uses.push(r#use);
53 }
54 }
55
56 for m in text.models {
57 if let Some(model) =
58 result.merge_degrade_failure(Model::new(Arc::clone(&script), m.clone()))
59 {
60 let name = model.read().unwrap().name.clone();
61 script.write().unwrap().models.insert(name, model);
62 }
63 }
64
65 for s in text.treatments {
66 if let Some(treatment) =
67 result.merge_degrade_failure(Treatment::new(Arc::clone(&script), s.clone()))
68 {
69 let name = treatment.read().unwrap().name.clone();
70 script.write().unwrap().treatments.insert(name, treatment);
71 }
72 }
73
74 result
75 }
76
77 pub fn find_use(&self, element_as: &str) -> Option<&Arc<RwLock<Use>>> {
81 self.uses
82 .iter()
83 .find(|&u| u.read().unwrap().r#as == element_as)
84 }
85
86 pub fn find_model(&self, name: &str) -> Option<&Arc<RwLock<Model>>> {
88 self.models.get(name)
89 }
90
91 pub fn find_treatment(&self, name: &str) -> Option<&Arc<RwLock<Treatment>>> {
93 self.treatments.get(name)
94 }
95}
96
97impl Node for Script {
98 fn children(&self) -> Vec<Arc<RwLock<dyn Node>>> {
99 let mut children: Vec<Arc<RwLock<dyn Node>>> = Vec::new();
100
101 self.uses
102 .iter()
103 .for_each(|u| children.push(Arc::clone(&u) as Arc<RwLock<dyn Node>>));
104 self.models
105 .iter()
106 .for_each(|(_, m)| children.push(Arc::clone(&m) as Arc<RwLock<dyn Node>>));
107 self.treatments
108 .iter()
109 .for_each(|(_, s)| children.push(Arc::clone(&s) as Arc<RwLock<dyn Node>>));
110
111 children
112 }
113}
114
115#[cfg(test)]
116mod tests {
117 }