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 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}