#[macro_export]
macro_rules! cmd {
(sh status $cmd:expr; dir: $dir:expr) => {{
match $crate::util::cmd::parse_sh(&$cmd.to_string()) {
Ok((binary, args)) => $crate::util::cmd::run_status(&binary, &args, Some($dir.as_ref())),
Err(e) => Err(e),
}
}};
(sh status $cmd:expr) => {{
match $crate::util::cmd::parse_sh(&$cmd.to_string()) {
Ok((binary, args)) => $crate::util::cmd::run_status(&binary, &args, None),
Err(e) => Err(e),
}
}};
(sh $cmd:expr; dir: $dir:expr) => {{
match $crate::util::cmd::parse_sh(&$cmd.to_string()) {
Ok((binary, args)) => $crate::util::cmd::run_output(&binary, &args, Some($dir.as_ref())),
Err(e) => Err(e),
}
}};
(sh $cmd:expr) => {{
match $crate::util::cmd::parse_sh(&$cmd.to_string()) {
Ok((binary, args)) => $crate::util::cmd::run_output(&binary, &args, None),
Err(e) => Err(e),
}
}};
(status bash $cmd:expr; dir: $dir:expr) => {{
$crate::util::cmd::run_shell_status("bash", &["-c"], &$cmd.to_string(), Some($dir.as_ref()))
}};
(status bash $cmd:expr) => {{
$crate::util::cmd::run_shell_status("bash", &["-c"], &$cmd.to_string(), None)
}};
(bash status $cmd:expr; dir: $dir:expr) => {{
$crate::util::cmd::run_shell_status("bash", &["-c"], &$cmd.to_string(), Some($dir.as_ref()))
}};
(bash status $cmd:expr) => {{
$crate::util::cmd::run_shell_status("bash", &["-c"], &$cmd.to_string(), None)
}};
(bash $cmd:expr; dir: $dir:expr) => {{
$crate::util::cmd::run_shell_output("bash", &["-c"], &$cmd.to_string(), Some($dir.as_ref()))
}};
(bash $cmd:expr) => {{
$crate::util::cmd::run_shell_output("bash", &["-c"], &$cmd.to_string(), None)
}};
(status pwsh $cmd:expr; dir: $dir:expr) => {{
$crate::util::cmd::run_shell_status("pwsh", &["-NoProfile", "-Command"], &$cmd.to_string(), Some($dir.as_ref()))
}};
(status pwsh $cmd:expr) => {{
$crate::util::cmd::run_shell_status("pwsh", &["-NoProfile", "-Command"], &$cmd.to_string(), None)
}};
(pwsh status $cmd:expr; dir: $dir:expr) => {{
$crate::util::cmd::run_shell_status("pwsh", &["-NoProfile", "-Command"], &$cmd.to_string(), Some($dir.as_ref()))
}};
(pwsh status $cmd:expr) => {{
$crate::util::cmd::run_shell_status("pwsh", &["-NoProfile", "-Command"], &$cmd.to_string(), None)
}};
(pwsh $cmd:expr; dir: $dir:expr) => {{
$crate::util::cmd::run_shell_output("pwsh", &["-NoProfile", "-Command"], &$cmd.to_string(), Some($dir.as_ref()))
}};
(pwsh $cmd:expr) => {{
$crate::util::cmd::run_shell_output("pwsh", &["-NoProfile", "-Command"], &$cmd.to_string(), None)
}};
(try sh $cmd:expr; dir: $dir:expr) => {{
match $crate::util::cmd::parse_sh(&$cmd.to_string()) {
Ok((binary, args)) => $crate::util::cmd::try_from_output(
$crate::util::cmd::run_output(&binary, &args, Some($dir.as_ref())),
),
Err(e) => Err(format!("{e}")),
}
}};
(try sh $cmd:expr) => {{
match $crate::util::cmd::parse_sh(&$cmd.to_string()) {
Ok((binary, args)) => $crate::util::cmd::try_from_output(
$crate::util::cmd::run_output(&binary, &args, None),
),
Err(e) => Err(format!("{e}")),
}
}};
(try bash $cmd:expr; dir: $dir:expr) => {{
$crate::util::cmd::try_from_output(
$crate::util::cmd::run_shell_output("bash", &["-c"], &$cmd.to_string(), Some($dir.as_ref())),
)
}};
(try bash $cmd:expr) => {{
$crate::util::cmd::try_from_output(
$crate::util::cmd::run_shell_output("bash", &["-c"], &$cmd.to_string(), None),
)
}};
(try pwsh $cmd:expr; dir: $dir:expr) => {{
$crate::util::cmd::try_from_output(
$crate::util::cmd::run_shell_output("pwsh", &["-NoProfile", "-Command"], &$cmd.to_string(), Some($dir.as_ref())),
)
}};
(try pwsh $cmd:expr) => {{
$crate::util::cmd::try_from_output(
$crate::util::cmd::run_shell_output("pwsh", &["-NoProfile", "-Command"], &$cmd.to_string(), None),
)
}};
(status $binary:literal $($arg:literal)*; dir: $dir:expr) => {{
$crate::util::cmd::run_status($binary, [$($arg),*], Some($dir.as_ref()))
}};
(status $binary:literal $($arg:literal)*) => {{
$crate::util::cmd::run_status($binary, [$($arg),*], None)
}};
(status $binary:expr, [ $($arg:expr),* $(,)? ]; dir: $dir:expr) => {{
let mut __cmd = $crate::prelude::Command::new($binary);
__cmd.args([$($arg),*]);
__cmd.current_dir($dir);
__cmd.status()
}};
(status $binary:expr, [ $($arg:expr),* $(,)? ]) => {{
$crate::prelude::Command::new($binary).args([$($arg),*]).status()
}};
(status $binary:expr, $args:expr; dir: $dir:expr) => {{
let mut __cmd = $crate::prelude::Command::new($binary);
__cmd.args($args);
__cmd.current_dir($dir);
__cmd.status()
}};
(status $binary:expr, $args:expr) => {{
$crate::prelude::Command::new($binary).args($args).status()
}};
(try $binary:literal $($arg:literal)*; dir: $dir:expr) => {{
$crate::util::cmd::try_from_output(
$crate::util::cmd::run_output($binary, [$($arg),*], Some($dir.as_ref())),
)
}};
(try $binary:literal $($arg:literal)*) => {{
$crate::util::cmd::try_from_output(
$crate::util::cmd::run_output($binary, [$($arg),*], None),
)
}};
(try $binary:expr, [ $($arg:expr),* $(,)? ]; dir: $dir:expr) => {{
let mut __cmd = $crate::prelude::Command::new($binary);
__cmd.args([$($arg),*]);
__cmd.current_dir($dir);
$crate::util::cmd::try_from_output(__cmd.output())
}};
(try $binary:expr, [ $($arg:expr),* $(,)? ]) => {{
$crate::util::cmd::try_from_output(
$crate::prelude::Command::new($binary).args([$($arg),*]).output(),
)
}};
(try $binary:expr, $args:expr; dir: $dir:expr) => {{
let mut __cmd = $crate::prelude::Command::new($binary);
__cmd.args($args);
__cmd.current_dir($dir);
$crate::util::cmd::try_from_output(__cmd.output())
}};
(try $binary:expr, $args:expr) => {{
$crate::util::cmd::try_from_output(
$crate::prelude::Command::new($binary).args($args).output(),
)
}};
($binary:literal $($arg:literal)*; dir: $dir:expr) => {{
$crate::util::cmd::run_output($binary, [$($arg),*], Some($dir.as_ref()))
}};
($binary:literal $($arg:literal)*) => {{
$crate::util::cmd::run_output($binary, [$($arg),*], None)
}};
($binary:expr, [ $($arg:expr),* $(,)? ]; dir: $dir:expr) => {{
$crate::util::cmd::run_output($binary, [$($arg),*], Some($dir.as_ref()))
}};
($binary:expr, [ $($arg:expr),* $(,)? ]) => {{
$crate::util::cmd::run_output($binary, [$($arg),*], None)
}};
($binary:expr, $args:expr; dir: $dir:expr) => {{
$crate::util::cmd::run_output($binary, $args, Some($dir.as_ref()))
}};
($binary:expr, $args:expr) => {{
$crate::util::cmd::run_output($binary, $args, None)
}};
}
#[macro_export]
macro_rules! args {
(@build $acc:expr; .. $item:expr, $($rest:tt)*) => {
$crate::args!(@build ($acc.chain($item.into_iter().map(|s| s.into()))); $($rest)*)
};
(@build $acc:expr; .. $item:expr) => {
$acc.chain($item.into_iter().map(|s| s.into())).collect::<Vec<std::ffi::OsString>>()
};
(@build $acc:expr; ($k:expr, $v:expr), $($rest:tt)*) => {
$crate::args!(@build ($acc.chain(core::iter::once($k.into())).chain(core::iter::once($v.into()))); $($rest)*)
};
(@build $acc:expr; ($k:expr, $v:expr)) => {
$acc.chain(core::iter::once($k.into())).chain(core::iter::once($v.into())).collect::<Vec<std::ffi::OsString>>()
};
(@build $acc:expr; $item:expr, $($rest:tt)*) => {
$crate::args!(@build ($acc.chain(core::iter::once($item.into()))); $($rest)*)
};
(@build $acc:expr; $item:expr) => {
$acc.chain(core::iter::once($item.into())).collect::<Vec<std::ffi::OsString>>()
};
(@build $acc:expr;) => {
$acc.collect::<Vec<std::ffi::OsString>>()
};
($($tt:tt)*) => {
$crate::args!(@build (core::iter::empty::<std::ffi::OsString>()); $($tt)*)
};
}
#[macro_export]
macro_rules! check {
($category:expr, $success:expr $(, $field:ident : $value:expr )* $(,)?) => {
$crate::check!(@apply $crate::analyzer::Check::init().category($category).success($success) $(, $field : $value )*)
};
(@apply $builder:expr) => {
$builder.build()
};
(@apply $builder:expr, $field:ident : $value:expr $(, $rest_field:ident : $rest_value:expr )* ) => {
$crate::check!(@apply $builder.$field($value) $(, $rest_field : $rest_value )*)
};
}
#[macro_export]
macro_rules! check_ok {
($category:expr $(, $field:ident : $value:expr )* $(,)?) => {
$crate::check!($category, true $(, $field : $value )*)
};
}
#[macro_export]
macro_rules! check_err {
($category:expr $(, $field:ident : $value:expr )* $(,)?) => {
$crate::check!($category, false, severity: $crate::analyzer::CheckSeverity::Error $(, $field : $value )*)
};
}
#[macro_export]
macro_rules! fail {
($msg:literal, $($rest:tt)*) => {
tracing::error!(
"{}",
format!(
"=> {} {}",
$crate::util::Label::fail(),
format!($msg, $($rest)*)
)
);
};
($msg:literal) => {
tracing::error!("{}", format!("=> {} {}", $crate::util::Label::fail(), $msg));
};
($($args:tt)*) => {
tracing::error!($($args)*);
};
}
#[macro_export]
macro_rules! skip {
($msg:literal, $($rest:tt)*) => {
tracing::warn!(
"{}",
format!(
"=> {}{}",
$crate::util::Label::skip(),
format!($msg, $($rest)*)
)
);
};
($msg:literal) => {
tracing::warn!("{}", format!("=> {}{}", $crate::util::Label::skip(), $msg));
};
($($args:tt)*) => {
tracing::warn!($($args)*);
};
}
#[macro_export]
macro_rules! param {
(Body $val:expr) => {
$crate::io::api::Param::of_type($crate::io::api::ParamStyle::Body)
.values(vec![vec![Some($val)]])
.with_key("")
};
(Body, $val:expr) => {
$crate::io::api::Param::of_type($crate::io::api::ParamStyle::Body)
.values(vec![vec![Some($val)]])
.with_key("")
};
($style:ident, $name:expr, ( $( ($($val:expr),* $(,)?) ),+ $(,)? )) => {
$crate::io::api::Param::of_type($crate::io::api::ParamStyle::$style)
.values(vec![ $( vec![ $( Some($val) ),* ] ),* ])
.with_key($name)
};
($style:ident, $name:expr, ($($val:expr),+ $(,)?)) => {
$crate::io::api::Param::of_type($crate::io::api::ParamStyle::$style)
.values(vec![vec![ $( Some($val) ),* ]])
.with_key($name)
};
($style:ident, $name:expr, vec![ $( vec![ $($val:expr),* $(,)? ] ),* $(,)? ]) => {
$crate::io::api::Param::of_type($crate::io::api::ParamStyle::$style)
.values(vec![ $( vec![ $( Some($val) ),* ] ),* ])
.with_key($name)
};
($style:ident, $name:expr, $val:expr) => {
$crate::io::api::Param::of_type($crate::io::api::ParamStyle::$style)
.values(vec![vec![Some($val)]])
.with_key($name)
};
($style:path, $name:expr, ( $( ($($val:expr),* $(,)?) ),+ $(,)? )) => {
$crate::io::api::Param::of_type($style)
.values(vec![ $( vec![ $( Some($val) ),* ] ),* ])
.with_key($name)
};
($style:path, $name:expr, ($($val:expr),+ $(,)?)) => {
$crate::io::api::Param::of_type($style)
.values(vec![vec![ $( Some($val) ),* ]])
.with_key($name)
};
($style:path, $name:expr, vec![ $( vec![ $($val:expr),* $(,)? ] ),* $(,)? ]) => {
$crate::io::api::Param::of_type($style)
.values(vec![ $( vec![ $( Some($val) ),* ] ),* ])
.with_key($name)
};
($style:path, $name:expr, $val:expr) => {
$crate::io::api::Param::of_type($style)
.values(vec![vec![Some($val)]])
.with_key($name)
};
}
#[macro_export]
macro_rules! method_validator {
($(#[$meta:meta])* $fn_name:ident, $method:ident, $code:literal, $message:literal) => {
#[doc = concat!("Check if value is a valid ", $code)]
$(#[$meta])*
pub fn $fn_name(value: &str) -> Result<(), ::validator::ValidationError> {
match value.$method() {
| true => Ok(()),
| _ => Err(::validator::ValidationError::new($code).with_message($message.into())),
}
}
};
($(#[$meta:meta])* $fn_name:ident, $method:ident, $code:literal) => {
#[doc = concat!("Check if value is a valid ", $code)]
$(#[$meta])*
pub fn $fn_name(value: &str) -> Result<(), ::validator::ValidationError> {
match value.$method() {
| true => Ok(()),
| _ => Err(::validator::ValidationError::new($code)
.with_message(concat!("Provide valid ", $code).into())),
}
}
};
($(#[$meta:meta])* $fn_name:ident, $code:literal, $message:literal) => {
#[doc = concat!("Check if value is a valid ", $code)]
$(#[$meta])*
pub fn $fn_name(value: &str) -> Result<(), ::validator::ValidationError> {
match value.$fn_name() {
| true => Ok(()),
| _ => Err(::validator::ValidationError::new($code).with_message($message.into())),
}
}
};
($(#[$meta:meta])* $fn_name:ident, $code:literal) => {
#[doc = concat!("Check if value is a valid ", $code)]
$(#[$meta])*
pub fn $fn_name(value: &str) -> Result<(), ::validator::ValidationError> {
match value.$fn_name() {
| true => Ok(()),
| _ => Err(::validator::ValidationError::new($code)
.with_message(concat!("Provide valid ", $code, " value").into())),
}
}
};
}
#[macro_export]
macro_rules! regex_validator {
($(#[$meta:meta])* $fn_name:ident, $regex:expr, $code:literal, $message:literal) => {
#[doc = concat!("Check if value is a valid ", $code)]
$(#[$meta])*
pub fn $fn_name(value: &str) -> Result<(), ::validator::ValidationError> {
match $regex.is_match(value) {
| Ok(value) if value => Ok(()),
| _ => Err(::validator::ValidationError::new($code).with_message($message.into())),
}
}
};
($(#[$meta:meta])* $fn_name:ident, $regex:expr, $code:literal) => {
#[doc = concat!("Check if value is a valid ", $code)]
$(#[$meta])*
pub fn $fn_name(value: &str) -> Result<(), ::validator::ValidationError> {
match $regex.is_match(value) {
| Ok(value) if value => Ok(()),
| _ => Err(::validator::ValidationError::new($code)
.with_message(concat!("Provide valid ", $code).into())),
}
}
};
}
#[macro_export]
macro_rules! list_validator {
($(#[$meta:meta])* $fn_name:ident, $validator:ident, $code:literal, $message:literal) => {
#[doc = concat!("Check if all values are valid ", $code, " entries")]
$(#[$meta])*
pub fn $fn_name(value: &[String]) -> Result<(), ::validator::ValidationError> {
value
.iter()
.position(|x| $validator(x).is_err())
.map(|index| {
let mut err = ::validator::ValidationError::new($code).with_message($message.to_string().into());
err.add_param("index".into(), &index);
err
})
.map_or(Ok(()), Err)
}
};
($(#[$meta:meta])* $fn_name:ident, $validator:ident, $code:literal) => {
#[doc = concat!("Check if all values are valid ", $code, " entries")]
$(#[$meta])*
pub fn $fn_name(value: &[String]) -> Result<(), ::validator::ValidationError> {
value
.iter()
.position(|x| $validator(x).is_err())
.map(|index| {
let mut err = ::validator::ValidationError::new($code)
.with_message(concat!("Every ", $code, " should be valid").to_string().into());
err.add_param("index".into(), &index);
err
})
.map_or(Ok(()), Err)
}
};
}