Skip to main content

espforge_lib/examples/
mod.rs

1pub mod builder;
2pub mod config;
3pub mod fs;
4pub mod template;
5pub mod ui;
6
7use crate::cli::interactive::{self, Prompter};
8use crate::cli::model::ExampleConfig;
9use anyhow::Result;
10use builder::ConfigBuilder;
11use fs::OutputDirectory;
12use template::{ExampleExporter, ExampleTemplate};
13use ui::ResultPrinter;
14
15pub struct ExamplesArgs {
16    pub name: String,
17    pub project_name: Option<String>,
18    pub chip: Option<String>,
19}
20
21pub fn execute(args: ExamplesArgs) -> Result<()> {
22    let prompter = interactive::DialoguerPrompter::new();
23    execute_with_prompter(args, &prompter)
24}
25
26pub fn execute_noninteractive(args: ExamplesArgs) -> Result<()> {
27    // 1. Resolve Configuration directly from args
28    let template_name = args.name.clone();
29    let project_name = args.project_name.unwrap_or_else(|| args.name.clone());
30    let chip = args.chip.unwrap_or_else(|| "esp32c3".to_string());
31
32    let config = ExampleConfig {
33        template_name,
34        project_name,
35        chip,
36    };
37
38    // Validate example exists BEFORE creating any directories
39    ExampleTemplate::find(&config.template_name)
40        .map_err(|_| anyhow::anyhow!("Example '{}' not found", config.template_name))?;
41
42    // 2. Prepare Output Directory (Check existence, fail if exists)
43    let output = OutputDirectory::prepare_noninteractive(&config)?;
44
45    // 3. Export the Template and Update Config
46    let exporter = ExampleExporter::new();
47    let result = exporter.export(&config, &output)?;
48
49    // 4. Display Success
50    ResultPrinter::display_success(&result);
51
52    Ok(())
53}
54
55fn execute_with_prompter(args: ExamplesArgs, prompter: &dyn Prompter) -> Result<()> {
56    // 1. Resolve Configuration (Args + User Input)
57    let config = ConfigBuilder::from_args(args, prompter)?.build()?;
58
59    // 2. Prepare Output Directory (Check existence, confirm overwrite)
60    let output = OutputDirectory::prepare(&config, prompter)?;
61
62    // 3. Export the Template and Update Config
63    let exporter = ExampleExporter::new();
64    let result = exporter.export(&config, &output)?;
65
66    // 4. Display Success
67    ResultPrinter::display_success(&result);
68
69    Ok(())
70}