distrib-rust 0.0.4

Distrib helps you distribute your software.
Documentation
// This is free and unencumbered software released into the public domain.

use alloc::{boxed::Box, string::String, vec::Vec};
use core::error::Error;
use distrib_common::{BoxError, Build, Clean, PackageRegistry, Publish, Tool, Utf8PathBuf};
use std::process::Command;

pub const CARGO_COMMAND: &str = "cargo";

#[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub struct CargoProgram(Utf8PathBuf);

impl Default for CargoProgram {
    fn default() -> Self {
        Self(CARGO_COMMAND.into())
    }
}

impl From<Utf8PathBuf> for CargoProgram {
    fn from(input: Utf8PathBuf) -> Self {
        Self(input)
    }
}

impl<T> From<&T> for CargoProgram
where
    T: Clone + Into<Self>,
{
    fn from(t: &T) -> Self {
        t.clone().into()
    }
}

impl From<CargoProgram> for Command {
    fn from(input: CargoProgram) -> Self {
        Command::new(input.0)
    }
}

impl CargoProgram {}

impl Tool for CargoProgram {}

impl Clean for CargoProgram {
    fn clean(&self) -> Result<(), BoxError> {
        let mut cmd = Command::from(self.clone());
        cmd.args(["clean"]);

        #[cfg(feature = "tracing")]
        tracing::info!("Executing {:?}", cmd);

        cmd.status().map_err(|err| Box::new(err))?;
        Ok(())
    }
}

impl Build for CargoProgram {
    fn build(&self) -> Result<(), BoxError> {
        let mut cmd = Command::from(self.clone());
        cmd.args(["build"]);

        #[cfg(feature = "tracing")]
        tracing::info!("Executing {:?}", cmd);

        cmd.status().map_err(|err| Box::new(err))?;
        Ok(())
    }
}

impl Publish for CargoProgram {
    fn publish(&self, _registry: Option<PackageRegistry>) -> Result<(), BoxError> {
        todo!() // TODO
    }
}