use serde::{Deserialize, Serialize};
use crate::models::action::ExpectMode;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ArgActionModel {
pub name: String,
#[serde(default)]
pub short: Option<char>,
pub expect: ExpectMode,
#[serde(default)]
pub help: Option<String>,
#[serde(default)]
pub default: Option<String>,
}
impl From<&ArgActionModel> for clap::Arg {
fn from(model: &ArgActionModel) -> Self {
let leaked_name: &'static str = &*Box::leak(model.name.clone().into_boxed_str());
let mut arg = clap::Arg::new(leaked_name)
.long(leaked_name)
.required(model.default.is_none());
if let Some(help) = &model.help {
let leaked_help: &'static str = &*Box::leak(help.clone().into_boxed_str());
arg = arg.help(leaked_help);
}
if let Some(c) = model.short {
arg = arg.short(c);
}
match &model.expect {
ExpectMode::Bool => arg.action(clap::ArgAction::SetTrue),
_ => arg.value_parser(clap::value_parser!(String)),
}
}
}
impl std::fmt::Display for ExpectMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ExpectMode::Void => write!(f, "void"),
ExpectMode::Bool => write!(f, "bool"),
ExpectMode::Number => write!(f, "number"),
ExpectMode::String => write!(f, "string"),
ExpectMode::List(inner) => write!(f, "list<{}>", inner),
}
}
}