vika_cli/generator/
module_selector.rs

1use crate::error::{GenerationError, Result};
2use colored::*;
3use dialoguer::MultiSelect;
4
5pub fn select_modules(
6    available_modules: &[String],
7    ignored_modules: &[String],
8) -> Result<Vec<String>> {
9    let filtered_modules: Vec<String> = available_modules
10        .iter()
11        .filter(|m| !ignored_modules.contains(m))
12        .cloned()
13        .collect();
14
15    if filtered_modules.is_empty() {
16        return Err(GenerationError::NoModulesAvailable.into());
17    }
18
19    println!("{}", "Which modules do you want to generate?".bright_cyan());
20    println!();
21
22    let selections = MultiSelect::new()
23        .with_prompt("Select modules (use space to toggle, enter to confirm)")
24        .items(&filtered_modules)
25        .interact()
26        .map_err(|e| GenerationError::InvalidOperation {
27            message: format!("Failed to get user selection: {}", e),
28        })?;
29
30    if selections.is_empty() {
31        return Err(GenerationError::NoModulesSelected.into());
32    }
33
34    let selected: Vec<String> = selections
35        .iter()
36        .map(|&i| filtered_modules[i].clone())
37        .collect();
38
39    Ok(selected)
40}