#[macro_export]
macro_rules! result_or_option {
(async $e:block) => {
async $e.await
};
(async $e:expr) => {
async { $e }.await
};
($e:block) => {
(|| $e)()
};
($e:expr) => {
(|| $e)()
};
}
#[cfg(test)]
mod tests {
#[allow(unused_imports)]
use std::io::Error as IoError;
use std::io::ErrorKind;
enum ResultKind {
Ok,
Err,
}
enum OptionKind {
Some,
None,
}
async fn async_result_helper(
result_kind: ResultKind,
) -> Result<i32, Box<dyn std::error::Error>> {
result_helper(result_kind)
}
async fn async_option_helper(option_kind: OptionKind) -> Option<i32> {
option_helper(option_kind)
}
fn result_helper(result_kind: ResultKind) -> Result<i32, Box<dyn std::error::Error>> {
match result_kind {
ResultKind::Ok => {
let computation_value = 1;
assert_eq!(computation_value, 1);
Ok(1)
}
ResultKind::Err => Err(Box::new(IoError::new(ErrorKind::Other, "Random Error"))),
}
}
fn option_helper(option_kind: OptionKind) -> Option<i32> {
match option_kind {
OptionKind::Some => {
let async_computation_value = 1;
assert_eq!(async_computation_value, 1);
Some(1)
}
OptionKind::None => None,
}
}
#[test]
fn test_result() {
let r: Result<i32, Box<dyn std::error::Error>> =
result_or_option!({ result_helper(ResultKind::Ok) });
assert!(r.is_ok_and(|v| v == 1));
let r1: Result<i32, Box<dyn std::error::Error>> =
result_or_option!(result_helper(ResultKind::Err));
assert!(r1.is_err());
}
#[tokio::test]
async fn test_async_result() {
use std::error::Error;
let r: Result<i32, Box<dyn Error>> =
result_or_option!(async { async_result_helper(ResultKind::Ok).await });
assert!(r.is_ok_and(|v| v == 1));
let r1: Result<i32, Box<dyn Error>> =
result_or_option!(async async_result_helper(ResultKind::Err).await);
assert!(r1.is_err());
}
#[test]
fn test_option() {
let r: Option<i32> = result_or_option!({ option_helper(OptionKind::Some) });
assert_eq!(r, Some(1));
let r1: Option<i32> = result_or_option!(option_helper(OptionKind::None));
assert!(r1.is_none());
}
#[tokio::test]
async fn test_async_option() {
let r: Option<i32> =
result_or_option!(async { async_option_helper(OptionKind::Some).await });
assert!(r.is_some_and(|v| v == 1));
let r1: Option<i32> = result_or_option!(async async_option_helper(OptionKind::None).await);
assert!(r1.is_none());
}
}