espforge_lib/examples/
builder.rs1use 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}