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