Skip to main content

espforge_lib/examples/
builder.rs

1use 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}