use clap::{Args, ValueEnum};
use espforge_core::answers::Overrides;
use espforge_model::{Console, Runtime};
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum RuntimeArg {
Blocking,
Embassy,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum ConsoleArg {
Uart,
JtagSerial,
}
#[derive(Args, Debug, Clone, Default)]
pub struct AnswerArgs {
#[arg(long)]
pub name: Option<String>,
#[arg(long)]
pub chip: Option<String>,
#[arg(long, value_enum)]
pub runtime: Option<RuntimeArg>,
#[arg(long, value_enum)]
pub console: Option<ConsoleArg>,
#[arg(long, value_name = "BOOL")]
pub defaults: Option<bool>,
#[arg(long = "option", value_name = "NAME=VALUE")]
pub options: Vec<String>,
}
impl From<RuntimeArg> for Runtime {
fn from(r: RuntimeArg) -> Self {
match r {
RuntimeArg::Blocking => Runtime::Blocking,
RuntimeArg::Embassy => Runtime::Embassy,
}
}
}
impl From<ConsoleArg> for Console {
fn from(c: ConsoleArg) -> Self {
match c {
ConsoleArg::Uart => Console::Uart,
ConsoleArg::JtagSerial => Console::JtagSerial,
}
}
}
impl AnswerArgs {
pub fn overrides(&self) -> Overrides {
Overrides {
name: self.name.clone(),
chip: self.chip.clone(),
runtime: self.runtime.map(Runtime::from),
console: self.console.map(Console::from),
defaults: self.defaults,
options: self.options.clone(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn every_flag_reaches_the_override_struct() {
let args = AnswerArgs {
name: Some("hello".into()),
chip: Some("esp32s3".into()),
runtime: Some(RuntimeArg::Embassy),
console: Some(ConsoleArg::JtagSerial),
defaults: Some(true),
options: vec!["wifi=true".into()],
};
let o = args.overrides();
assert_eq!(o.name.as_deref(), Some("hello"));
assert_eq!(o.chip.as_deref(), Some("esp32s3"));
assert_eq!(o.runtime, Some(Runtime::Embassy));
assert_eq!(o.console, Some(Console::JtagSerial));
assert_eq!(o.defaults, Some(true));
assert_eq!(o.options, ["wifi=true"]);
}
#[test]
fn no_flags_is_an_empty_override() {
let o = AnswerArgs::default().overrides();
assert!(o.name.is_none());
assert!(o.chip.is_none());
assert!(o.runtime.is_none());
assert!(o.console.is_none());
assert!(o.defaults.is_none());
assert!(o.options.is_empty());
}
}