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 std::{ collections::HashMap, fs::create_dir_all };
5use std::io::Write;
6use crate::utils::logger::Logger;
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()).expect("Failed to write AST to file");
36        }
37    }
38
39    pub fn build_audio(
40        &self,
41        modules: &HashMap<String, Vec<Statement>>,
42        normalized_output_dir: &str,
43        global_store: &mut GlobalStore
44    ) {
45        let logger = Logger::new();
46
47        let audio_engines = render_audio_with_modules(
48            modules.clone(),
49            &normalized_output_dir,
50            global_store
51        );
52
53        create_dir_all(format!("{}/audio", normalized_output_dir)).expect(
54            "Failed to create audio directory"
55        );
56
57        for (module_name, mut audio_engine) in audio_engines {
58            let formatted_module_name = module_name
59                .split('/')
60                .last()
61                .unwrap_or(&module_name)
62                .replace(".deva", "");
63
64            let output_path = format!(
65                "{}/audio/{}.wav",
66                normalized_output_dir,
67                formatted_module_name
68            );
69
70            match audio_engine.generate_wav_file(&output_path) {
71                Ok(_) => {}
72                Err(msg) => {
73                    logger.log_error_with_stacktrace(
74                        &format!(
75                            "Unable to generate WAV file for module '{}': {}",
76                            formatted_module_name,
77                            msg
78                        ),
79                        &module_name
80                    );
81                }
82            }
83        }
84    }
85}