#[macro_export]
macro_rules! print_debugging {
($($arg:tt)*) => ( eprintln!($($arg)*));
}
#[macro_export]
macro_rules! pos {
() => {
&format!("{}:{}:{}:", file!(), line!(), column!())
};
}
pub trait ResultLogError<T, E>: Sized {
fn log(self, file_line_column: &str) -> Self;
fn log_msg(self, file_line_column: &str, msg: &str) -> Self;
}
impl<T, E: std::fmt::Debug> ResultLogError<T, E> for core::result::Result<T, E> {
fn log(self, file_line_column: &str) -> Self {
self.inspect_err(|err| tracing::debug!("automation_tasks_rs/{file_line_column} {err:?}"))
}
fn log_msg(self, file_line_column: &str, msg: &str) -> Self {
self.inspect_err(|err| tracing::debug!("automation_tasks_rs/{file_line_column} {msg} {err:?}"))
}
}
pub trait OptionLogNone<T>: Sized {
#[allow(dead_code)]
fn log(self, file_line_column: &str) -> anyhow::Result<T>;
fn log_msg(self, file_line_column: &str, msg: &str) -> anyhow::Result<T>;
}
impl<T> OptionLogNone<T> for core::option::Option<T> {
fn log(self, file_line_column: &str) -> anyhow::Result<T> {
match self {
Some(x) => Ok(x),
None => {
tracing::debug!("Option None: {file_line_column}");
anyhow::bail!("Option None: {file_line_column}")
}
}
}
fn log_msg(self, file_line_column: &str, msg: &str) -> anyhow::Result<T> {
match self {
Some(x) => Ok(x),
None => {
tracing::debug!("Option None: {msg} {file_line_column}");
anyhow::bail!("Option None: {msg} {file_line_column}")
}
}
}
}
pub fn run_shell_command_success(shell_command: &str) -> bool {
if !shell_command.starts_with("echo ") && !shell_command.starts_with("printf ") {
println!(" $ {}", shell_command);
}
match std::process::Command::new("sh").arg("-c").arg(shell_command).status() {
Ok(status) => status.success(),
Err(_err) => false,
}
}