multiversx_sc_meta_lib/contract/sc_config/
execute_command.rs1use std::error::Error;
2use std::fmt::Display;
3use std::fmt::Formatter;
4use std::process::{Command, ExitStatus, Stdio};
5
6#[derive(Debug)]
7pub enum ExecuteCommandError {
8 ErrorRunning(String),
9 JobFailed(String),
10 ErrorParsing(String),
11 ErrorRunningBuildProcess,
12}
13
14impl Error for ExecuteCommandError {}
15
16impl Display for ExecuteCommandError {
17 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
18 let message = match self {
19 ExecuteCommandError::ErrorRunning(job) => format!(
20 "Error running {}: ensure it is installed and available in your system PATH.",
21 job
22 ),
23 ExecuteCommandError::JobFailed(job) => {
24 format!("Job {} failed.", job)
25 }
26 ExecuteCommandError::ErrorParsing(job) => format!("Error parsing {} output", job),
27 ExecuteCommandError::ErrorRunningBuildProcess => {
28 "contract build process was not running".to_string()
29 }
30 };
31 write!(f, "{}", message)
32 }
33}
34
35pub(crate) fn execute_command(
36 command: &mut Command,
37 job: &str,
38) -> Result<String, ExecuteCommandError> {
39 let output = command
40 .stderr(Stdio::inherit())
41 .output()
42 .map_err(|_| ExecuteCommandError::ErrorRunning(job.to_string()))?;
43
44 if !output.status.success() {
45 return Err(ExecuteCommandError::JobFailed(job.to_string()));
46 }
47
48 String::from_utf8(output.stdout).map_err(|_| ExecuteCommandError::ErrorParsing(job.to_string()))
49}
50
51pub(crate) fn execute_spawn_command(
52 command: &mut Command,
53 job: &str,
54) -> Result<ExitStatus, ExecuteCommandError> {
55 let response = command
56 .spawn()
57 .expect("failed to spawn contract build process")
58 .wait()
59 .map_err(|_| ExecuteCommandError::ErrorRunningBuildProcess)?;
60
61 if !response.success() {
62 return Err(ExecuteCommandError::JobFailed(job.to_string()));
63 }
64
65 Ok(response)
66}