espforge_lib/examples/
builder.rs1use super::ExamplesArgs;
2use crate::cli::interactive::Prompter;
3use crate::cli::model::ExampleConfig;
4use crate::examples::template::ExampleTemplate;
5use anyhow::Result;
6
7pub struct ConfigBuilder<'a> {
8 args: ExamplesArgs,
9 prompter: &'a dyn Prompter,
10}
11
12impl<'a> ConfigBuilder<'a> {
13 pub fn from_args(args: ExamplesArgs, prompter: &'a dyn Prompter) -> Result<Self> {
14 Ok(Self { args, prompter })
15 }
16
17 pub fn build(self) -> Result<ExampleConfig> {
18 let name = self.resolve_example_name()?;
19 let project_name = self.resolve_project_name(&name)?;
20 let chip = self.resolve_chip(&name)?;
21
22 Ok(ExampleConfig {
23 template_name: name,
24 project_name,
25 chip,
26 })
27 }
28
29 fn resolve_example_name(&self) -> Result<String> {
30 if self.args.name.is_empty() {
31 self.prompter.select_example()
32 } else {
33 Ok(self.args.name.clone())
34 }
35 }
36
37 fn resolve_project_name(&self, default: &str) -> Result<String> {
38 match &self.args.project_name {
39 Some(name) => Ok(name.clone()),
40 None => self.prompter.prompt_project_name(default),
41 }
42 }
43
44 fn resolve_chip(&self, example_name: &str) -> Result<String> {
45 if let Some(chip) = &self.args.chip {
46 return Ok(chip.clone());
47 }
48
49 if let Ok(template) = ExampleTemplate::find(example_name) {
50 if let Some(chip) = template.read_chip_from_yaml() {
51 return Ok(chip);
52 }
53 }
54
55 self.prompter.select_chip()
56 }
57}