devalang_core/core/builder/
mod.rs

1use crate::core::audio::renderer::render_audio_with_modules;
2use crate::core::parser::statement::Statement;
3use crate::core::store::global::GlobalStore;
4use devalang_utils::logger::Logger;
5use std::io::Write;
6use std::{collections::HashMap, fs::create_dir_all};
7
8pub struct Builder {}
9
10impl Default for Builder {
11    fn default() -> Self {
12        Self::new()
13    }
14}
15
16impl Builder {
17    pub fn new() -> Self {
18        Builder {}
19    }
20
21    pub fn build_ast(
22        &self,
23        modules: &HashMap<String, Vec<Statement>>,
24        out_dir: &str,
25        compress: bool,
26    ) {
27        for (name, statements) in modules {
28            let formatted_name = name.split("/").last().unwrap_or(name);
29            let formatted_name = formatted_name.replace(".deva", "");
30
31            create_dir_all(format!("{}/ast", out_dir)).expect("Failed to create AST directory");
32
33            let file_path = format!("{}/ast/{}.json", out_dir, formatted_name);
34            let mut file = std::fs::File::create(file_path).expect("Failed to create AST file");
35            let content = if compress {
36                serde_json::to_string(&statements).expect("Failed to serialize AST")
37            } else {
38                serde_json::to_string_pretty(&statements).expect("Failed to serialize AST")
39            };
40
41            file.write_all(content.as_bytes())
42                .expect("Failed to write AST to file");
43        }
44    }
45
46    pub fn build_audio(
47        &self,
48        modules: &HashMap<String, Vec<Statement>>,
49        normalized_output_dir: &str,
50        global_store: &mut GlobalStore,
51    ) {
52        let logger = Logger::new();
53
54        let audio_engines =
55            render_audio_with_modules(modules.clone(), normalized_output_dir, global_store);
56
57        create_dir_all(format!("{}/audio", normalized_output_dir))
58            .expect("Failed to create audio directory");
59
60        for (module_name, mut audio_engine) in audio_engines {
61            let formatted_module_name = module_name
62                .split('/')
63                .next_back()
64                .unwrap_or(&module_name)
65                .replace(".deva", "");
66
67            let output_path = format!(
68                "{}/audio/{}.wav",
69                normalized_output_dir, formatted_module_name
70            );
71
72            match audio_engine.generate_wav_file(&output_path) {
73                Ok(_) => {}
74                Err(msg) => {
75                    logger.log_error_with_stacktrace(
76                        &format!(
77                            "Unable to generate WAV file for module '{}': {}",
78                            formatted_module_name, msg
79                        ),
80                        &module_name,
81                    );
82                }
83            }
84        }
85    }
86}