#![macro_use]
macro_rules! result { ($t: ty) => { Result<$t, NCurseswWinError> } }
macro_rules! assert_origin {
($str: expr, $window_size: expr, $origin: expr) => {
let _window_size = $window_size;
assert!(
$origin.y <= _window_size.lines && $origin.x <= _window_size.columns,
"{}() : origin is invalid, origin={}, window_size={}", $str, $origin, _window_size
);
}
}
macro_rules! assert_region {
($str: expr, $window_size: expr, $region: expr) => {
let _window_size = $window_size;
assert!(
$region.top < $region.bottom && $region.bottom <= _window_size.lines,
"{}() : region is invalid, region={}, window_size={}", $str, $region, _window_size
);
}
}
macro_rules! assert_origin_hlength {
($str: expr, $window_size: expr, $origin: expr, $length: expr) => {
let _window_size = $window_size;
assert_origin!($str, _window_size, $origin);
assert!(
$origin.x + $length <= _window_size.columns,
"{}() : attempting to write over window edge, origin.x={} + length={} <= window_size.columns={}", $str, $origin.x, $length, _window_size.columns
);
}
}
macro_rules! assert_origin_vlength {
($str: expr, $window_size: expr, $origin: expr, $length: expr) => {
let _window_size = $window_size;
assert_origin!($str, _window_size, $origin);
assert!(
$origin.y + $length <= _window_size.lines,
"{}() : attempting to write over window edge, origin.y={} + length={} <= window_size.lines={}", $str, $origin.y, $length, _window_size.lines
);
}
}
macro_rules! c_str_with_nul { ($name: ident) => { unsafe { &*($name.to_c_str()?.as_bytes_with_nul() as *const [u8] as *const [i8]) } } }
macro_rules! option_length { ($length: expr) => { $length.map_or_else(|| Ok(-1), i32::try_from) } }
macro_rules! nonblocking_get {
($fname: ident, $func: ident, $str: expr, $type: ty) => {
fn $fname(&self, timeout: Timeout) -> result!(NonBlockingResult<$type>) {
let orig_timeout = self.get_timeout()?;
self.set_timeout(timeout)?;
let result = match self.$func() {
Err(source) => {
if source == crate::ncurseswwinerror::timeout_error(&$str) {
Ok(None)
} else {
Err(source)
}
},
Ok(result) => Ok(Some(result))
};
if result.is_ok() {
self.set_timeout(orig_timeout)?;
}
result
}
}
}
macro_rules! nonblocking_get_with_origin {
($fname: ident, $fname_str: expr, $func: ident, $str: expr, $type: ident) => {
fn $fname(&self, origin: Origin, timeout: Timeout) -> result!(NonBlockingResult<$type>) {
assert_origin!($fname_str, self.size()?, origin);
let orig_timeout = self.get_timeout()?;
self.set_timeout(timeout)?;
let result = match self.$func(origin) {
Err(source) => {
if source == crate::ncurseswwinerror::timeout_error(&$str) {
Ok(None)
} else {
Err(source)
}
},
Ok(result) => Ok(Some(result))
};
if result.is_ok() {
self.set_timeout(orig_timeout)?;
}
result
}
}
}