1use 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!() }
74}