//- // Copyright 2017, 2018 Jason Lingle // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. //! Macros for internal use to reduce boilerplate. // Pervasive internal sugar macro_rules! mapfn { ($({#[$allmeta:meta]})* $(#[$meta:meta])* [$($vis:tt)*] fn $name:ident[$($gen:tt)*]($parm:ident: $input:ty) -> $output:ty { $($body:tt)* }) => { $(#[$allmeta])* $(#[$meta])* #[derive(Clone, Copy, Debug)] $($vis)* struct $name; $(#[$allmeta])* impl $($gen)* $crate::strategy::statics::MapFn<$input> for $name { type Output = $output; fn apply(&self, $parm: $input) -> $output { $($body)* } } } } macro_rules! delegate_vt_0 { () => { fn current(&self) -> Self::Value { self.0.current() } fn simplify(&mut self) -> bool { self.0.simplify() } fn complicate(&mut self) -> bool { self.0.complicate() } }; } macro_rules! opaque_strategy_wrapper { ($({#[$allmeta:meta]})* $(#[$smeta:meta])* pub struct $stratname:ident [$($sgen:tt)*][$($swhere:tt)*] ($innerstrat:ty) -> $stratvtty:ty; $(#[$vmeta:meta])* pub struct $vtname:ident [$($vgen:tt)*][$($vwhere:tt)*] ($innervt:ty) -> $actualty:ty; ) => { $(#[$allmeta])* $(#[$smeta])* #[must_use = "strategies do nothing unless used"] pub struct $stratname $($sgen)* ($innerstrat) $($swhere)*; $(#[$allmeta])* $(#[$vmeta])* pub struct $vtname $($vgen)* ($innervt) $($vwhere)*; $(#[$allmeta])* impl $($sgen)* Strategy for $stratname $($sgen)* $($swhere)* { type Tree = $stratvtty; type Value = $actualty; fn new_tree(&self, runner: &mut TestRunner) -> NewTree { self.0.new_tree(runner).map($vtname) } } $(#[$allmeta])* impl $($vgen)* ValueTree for $vtname $($vgen)* $($vwhere)* { type Value = $actualty; delegate_vt_0!(); } } } // Example: unwrap_or!(result, err => handle_err(err)); macro_rules! unwrap_or { ($unwrap: expr, $err: ident => $on_err: expr) => { match $unwrap { Ok(ok) => ok, Err($err) => $on_err, } }; }