essentia_codegen/
lib.rs

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}