use derive_setters::Setters;
use crate::toolchain::Version;
use crate::{Run, Step};
#[derive(Clone, Setters)]
#[setters(strip_option, into)]
pub struct Cargo {
pub command: String,
pub id: Option<String>,
pub name: Option<String>,
pub toolchain: Option<Version>,
#[setters(skip)]
pub args: Vec<String>,
}
impl Cargo {
pub fn new<T: ToString>(cmd: T) -> Self {
Self {
command: cmd.to_string(),
id: Default::default(),
name: Default::default(),
toolchain: Default::default(),
args: Default::default(),
}
}
pub fn nightly(mut self) -> Self {
self.toolchain = Some(Version::Nightly);
self
}
pub fn args<T: ToString>(mut self, args: T) -> Self {
self.args = vec![args.to_string()];
self
}
pub fn add_args<T: ToString>(mut self, args: T) -> Self {
self.args.extend(
args.to_string()
.split_whitespace()
.map(|s| s.to_string())
.collect::<Vec<_>>(),
);
self
}
}
impl From<Cargo> for Step<Run> {
fn from(value: Cargo) -> Self {
let mut command = vec!["cargo".to_string()];
if let Some(toolchain) = value.toolchain {
command.push(format!("+{toolchain}"));
}
command.push(value.command.clone());
command.extend(
value
.args
.into_iter()
.map(|arg| arg.trim().to_string())
.filter(|arg| !arg.is_empty()),
);
let mut step = Step::new(format!("Cargo {}", value.command)).run(command.join(" "));
if let Some(id) = value.id {
step = step.id(id);
}
if let Some(name) = value.name {
step = step.name(name);
}
step
}
}