#![cfg_attr(test, deny(warnings))] #![deny(missing_docs)] //! # mac //! //! A collection of great and ubiqutitous macros. //! pub mod test; pub mod mem; pub mod format; pub mod syntax_ext; pub mod matches; pub mod inspect; pub mod cfg; /// Unwraps an `Option` or returns from the function with the specified return /// value. /// /// Can be used on `Result`s by first calling `.ok()` or `.err()` on them. /// /// # Examples /// /// ``` /// # #[macro_use] extern crate mac; /// fn take_pair(iter: &mut I) -> Option<(::Item, ::Item)> { /// let first = unwrap_or_return!(iter.next(), None); /// Some((first, unwrap_or_return!(iter.next(), None))) /// } /// # fn main() { } /// ``` #[macro_export] macro_rules! unwrap_or_return { ($e:expr, $r:expr) => (match $e { Some(e) => e, None => return $r, }) } /// Do-while loop. /// /// # Examples /// /// ``` /// # #[macro_use] extern crate mac; /// # fn main() { /// let mut i = 0; /// let mut n = 0; /// /// do_while!({ /// n += i; /// i += 1; /// } while i < 5); /// /// assert_eq!(n, 10); /// # } /// ``` /// /// The loop always executes at least once. /// /// ``` /// # #[macro_use] extern crate mac; /// # fn main() { /// let mut ran = false; /// do_while!({ ran = true } while false); /// assert!(ran); /// # } /// ``` #[macro_export] macro_rules! do_while { ($body:block while $condition:expr) => { while { $body; $condition } { } } }