pub mod builder;
pub mod config;
pub mod fs;
pub mod template;
pub mod ui;
use crate::cli::interactive::{self, Prompter};
use anyhow::Result;
use builder::ConfigBuilder;
use fs::OutputDirectory;
use template::{ExampleExporter, ExampleTemplate};
use ui::ResultPrinter;
use crate::cli::model::ExampleConfig;
pub struct ExamplesArgs {
pub name: String,
pub project_name: Option<String>,
pub chip: Option<String>,
}
pub fn execute(args: ExamplesArgs) -> Result<()> {
let prompter = interactive::DialoguerPrompter::new();
execute_with_prompter(args, &prompter)
}
pub fn execute_noninteractive(args: ExamplesArgs) -> Result<()> {
let template_name = args.name.clone();
let project_name = args.project_name.unwrap_or_else(|| args.name.clone());
let chip = args.chip.unwrap_or_else(|| "esp32c3".to_string());
let config = ExampleConfig {
template_name,
project_name,
chip,
};
ExampleTemplate::find(&config.template_name)
.map_err(|_| anyhow::anyhow!("Example '{}' not found", config.template_name))?;
let output = OutputDirectory::prepare_noninteractive(&config)?;
let exporter = ExampleExporter::new();
let result = exporter.export(&config, &output)?;
ResultPrinter::display_success(&result);
Ok(())
}
fn execute_with_prompter(args: ExamplesArgs, prompter: &dyn Prompter) -> Result<()> {
let config = ConfigBuilder::from_args(args, prompter)?.build()?;
let output = OutputDirectory::prepare(&config, prompter)?;
let exporter = ExampleExporter::new();
let result = exporter.export(&config, &output)?;
ResultPrinter::display_success(&result);
Ok(())
}