espforge_lib/examples/
builder.rs

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