use derive_setters::Setters;
use crate::toolchain::Version;
use crate::{Run, Step};
#[derive(Setters)]
#[setters(strip_option, into)]
pub struct Cargo {
    pub command: String,
    pub id: Option<String>,
    pub name: Option<String>,
    pub toolchain: Option<Version>,
    pub args: Option<String>,
}
impl Cargo {
    pub fn new<T: ToString>(cmd: T) -> Cargo {
        Cargo {
            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
    }
}
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);
        if let Some(args) = value.args {
            if !args.is_empty() {
                command.push(args);
            }
        }
        let mut step = Step::run(command.join(" "));
        if let Some(id) = value.id {
            step = step.id(id);
        }
        if let Some(name) = value.name {
            step = step.name(name);
        }
        step
    }
}