1mod algorithm_generation;
2mod module_generation;
3
4use algorithm_generation::{GeneratedAlgorithm, generate_algorithm_module_file};
5use essentia_core::essentia::Essentia;
6use std::collections::HashMap;
7use std::path::Path;
8
9use crate::module_generation::category_module::generate_category_module_file;
10use crate::module_generation::main_module::generate_main_module_file;
11
12fn generate_module_files(
13 out_dir: &Path,
14 generated_algorithms: &[GeneratedAlgorithm],
15) -> std::io::Result<()> {
16 let mut categories: HashMap<String, Vec<String>> = HashMap::new();
17 for result in generated_algorithms {
18 categories
19 .entry(result.category_module_name.clone())
20 .or_default()
21 .push(result.algorithm_module_name.clone());
22 }
23
24 let mut sorted_categories: Vec<String> = categories.keys().cloned().collect();
25 sorted_categories.sort();
26
27 for category in &sorted_categories {
28 if let Some(algo_vec) = categories.get(category) {
29 generate_category_module_file(out_dir, category, algo_vec)?;
30 }
31 }
32
33 generate_main_module_file(out_dir, &sorted_categories)?;
34
35 Ok(())
36}
37
38pub fn generate_code(out_dir: &Path) -> std::io::Result<()> {
39 let essentia = Essentia::new();
40
41 let results: Vec<GeneratedAlgorithm> = essentia
42 .available_algorithms()
43 .map(|algorithm_name| {
44 let algorithm = essentia.create_algorithm(algorithm_name).unwrap();
45 let introspection = algorithm.introspection();
46
47 generate_algorithm_module_file(introspection, out_dir)
48 })
49 .collect::<std::io::Result<_>>()?;
50
51 generate_module_files(out_dir, &results)?;
52
53 Ok(())
54}