Skip to main content

distrib_rust/
program.rs

1// This is free and unencumbered software released into the public domain.
2
3use alloc::{boxed::Box, string::String, vec::Vec};
4use core::error::Error;
5use distrib_common::{BoxError, Build, Clean, PackageRegistry, Publish, Tool, Utf8PathBuf};
6use std::process::Command;
7
8pub const CARGO_COMMAND: &str = "cargo";
9
10#[derive(Clone, Debug, Eq, Hash, PartialEq)]
11pub struct CargoProgram(Utf8PathBuf);
12
13impl Default for CargoProgram {
14    fn default() -> Self {
15        Self(CARGO_COMMAND.into())
16    }
17}
18
19impl From<Utf8PathBuf> for CargoProgram {
20    fn from(input: Utf8PathBuf) -> Self {
21        Self(input)
22    }
23}
24
25impl<T> From<&T> for CargoProgram
26where
27    T: Clone + Into<Self>,
28{
29    fn from(t: &T) -> Self {
30        t.clone().into()
31    }
32}
33
34impl From<CargoProgram> for Command {
35    fn from(input: CargoProgram) -> Self {
36        Command::new(input.0)
37    }
38}
39
40impl CargoProgram {}
41
42impl Tool for CargoProgram {}
43
44impl Clean for CargoProgram {
45    fn clean(&self) -> Result<(), BoxError> {
46        let mut cmd = Command::from(self.clone());
47        cmd.args(["clean"]);
48
49        #[cfg(feature = "tracing")]
50        tracing::info!("Executing {:?}", cmd);
51
52        cmd.status().map_err(|err| Box::new(err))?;
53        Ok(())
54    }
55}
56
57impl Build for CargoProgram {
58    fn build(&self) -> Result<(), BoxError> {
59        let mut cmd = Command::from(self.clone());
60        cmd.args(["build"]);
61
62        #[cfg(feature = "tracing")]
63        tracing::info!("Executing {:?}", cmd);
64
65        cmd.status().map_err(|err| Box::new(err))?;
66        Ok(())
67    }
68}
69
70impl Publish for CargoProgram {
71    fn publish(&self, _registry: Option<PackageRegistry>) -> Result<(), BoxError> {
72        todo!() // TODO
73    }
74}