#[macro_export]
macro_rules! plugin_err {
(code = $code:expr, $($arg:tt)+) => {
WithReturnCode::<Error>::new(anyhow!($($arg)+), $code.into())
};
($($arg:tt)+) => {
WithReturnCode::<Error>::new(anyhow!($($arg)+), 1)
};
}
#[macro_export]
macro_rules! exec_command {
(input, $input:expr) => {
unsafe { exec_command(Json($input))?.0 }
};
(raw, $cmd:literal) => {
exec_command!(raw, $cmd, Vec::<String>::new())
};
(raw, $cmd:expr, $args:expr) => {
exec_command!(raw, ExecCommandInput::pipe($cmd, $args))
};
(raw, $input:expr) => {
unsafe { exec_command(Json($input)) }
};
(pipe, $cmd:literal) => {
exec_command!(pipe, $cmd, Vec::<String>::new())
};
(pipe, $cmd:expr, $args:expr) => {
exec_command!(input, ExecCommandInput::pipe($cmd, $args))
};
(inherit, $cmd:literal) => {
exec_command!(inherit, $cmd, Vec::<String>::new())
};
(inherit, $cmd:expr, $args:expr) => {
exec_command!(input, ExecCommandInput::inherit($cmd, $args))
};
($cmd:literal) => {
exec_command!(pipe, $cmd)
};
($cmd:expr, [ $($arg:literal),* ]) => {
exec_command!(pipe, $cmd, [ $($arg),* ])
};
($cmd:expr, $args:expr) => {
exec_command!(pipe, $cmd, $args)
};
}
#[macro_export]
macro_rules! host_env {
($name:expr, $value:expr) => {
unsafe { set_env_var($name.try_into()?, $value.try_into()?)? };
};
($name:expr) => {
unsafe {
let inner = get_env_var($name.try_into()?)?;
if inner.is_empty() {
None
} else {
Some(inner)
}
};
};
}
#[macro_export]
macro_rules! host_log {
(input, $input:expr) => {
unsafe {
host_log(Json($input))?;
};
};
(stdout, $($arg:tt)+) => {
host_log!(input, HostLogInput {
message: format!($($arg)+),
target: HostLogTarget::Stdout,
..HostLogInput::default()
})
};
(stderr, $($arg:tt)+) => {
host_log!(input, HostLogInput {
message: format!($($arg)+),
target: HostLogTarget::Stderr,
..HostLogInput::default()
})
};
($($arg:tt)+) => {
host_log!(input, format!($($arg)+).into())
};
}
#[macro_export]
macro_rules! real_path {
(buf, $path:expr) => {
real_path!($path.to_string_lossy())
};
($path:expr) => {
std::path::PathBuf::from(unsafe { from_virtual_path($path.try_into()?)? })
};
}
#[macro_export]
macro_rules! virtual_path {
(buf, $path:expr) => {
virtual_path!($path.to_string_lossy())
};
($path:expr) => {{
let data = unsafe { to_virtual_path($path.try_into()?)? };
let path: VirtualPath = json::from_str(&data)?;
path
}};
}