devalang_core/core/builder/
mod.rs1use 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}