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