use std::fs::File;
use std::io::Write;
use std::process::{Command, Stdio};
pub struct Execute;
const FILE_NAME: &str = "ExecuteLog.log";
impl Execute {
pub fn exe(command: &str, arguments: &[&str]) -> Result<(), std::io::Error> {
let output = Command::new(command)
.args(arguments)
.stdout(Stdio::inherit())
.stderr(Stdio::piped())
.spawn()
.map_err(|e| {
std::io::Error::new(
std::io::ErrorKind::Other,
format!("failed to execute cmd '{}': {}", command, e),
)
})?;
let _ = output.wait_with_output().map_err(|err| {
std::io::Error::new(
std::io::ErrorKind::Other,
format!("Failed to wait for command '{}': {}", command, err),
)
});
Ok(())
}
pub fn run(command: &str, arguments: &[&str]) -> Result<Vec<u8>, String> {
let output = Command::new(command)
.args(arguments)
.stdout(Stdio::piped())
.spawn()
.map_err(|e| format!("failed to execute cmd '{}' : {}", command, e))?;
let result = output
.wait_with_output()
.map_err(|err| format!("Failed to wait for command '{}': {}", command, err))?;
if result.status.success() {
Ok(result.stdout)
} else {
Err(format!(
"Command failed with exit code {}: {}",
result.status.code().unwrap_or_default(),
String::from_utf8_lossy(&result.stderr)
))
}
}
pub fn print_into_console(output: Result<Vec<u8>, String>) {
match output {
Ok(bytes) => {
let formatting = format!("{}", String::from_utf8_lossy(&bytes));
println!("{}", formatting);
}
Err(err) => eprintln!("Error: {}", err),
}
}
pub fn print_into_console_multiple(outputs: Vec<Result<Vec<u8>, String>>) {
for output in outputs {
Execute::print_into_console(output)
}
}
pub fn write_to_file(content: &Result<Vec<u8>, String>) -> std::io::Result<()> {
match content {
Ok(output_cmd) => {
let mut file = File::create(FILE_NAME)?;
file.write_all(output_cmd)?;
}
Err(e) => println!("Error {}", e),
}
Ok(())
}
pub fn write_combined_to_file(outputs: &[Result<Vec<u8>, String>]) -> std::io::Result<()> {
let mut file = std::fs::OpenOptions::new()
.create(true)
.append(true)
.open(FILE_NAME)?;
for (i, output) in outputs.iter().enumerate() {
match output {
Ok(output_cmd) => {
file.write_all(output_cmd)?;
}
Err(e) => {
println!("Error: {}", e);
}
}
if i < outputs.len() - 1 {
file.write_all(b"\n")?;
}
}
Ok(())
}
pub fn check_operation(op: &std::io::Result<()>) -> bool {
match op {
Ok(_) => {
println!("File created successfully in {}.", FILE_NAME);
true
}
Err(_) => {
panic!("Failed to create file {}.", FILE_NAME);
}
}
}
}