multiversx_sc_meta_lib/contract/sc_config/
execute_command.rs

1use 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}