//! # common macros for `libpt` //! //! This module implements macros for use with `libpt`. //// ATTRIBUTES //////////////////////////////////////////////////////////////////////////////////// // we want docs #![warn(missing_docs)] #![warn(rustdoc::missing_crate_level_docs)] //////////////////////////////////////////////////////////////////////////////////////////////////// // we want Debug everywhere. #![warn(missing_debug_implementations)] //////////////////////////////////////////////////////////////////////////////////////////////////// // enable clippy's extra lints, the pedantic version #![warn(clippy::pedantic)] //// IMPORTS /////////////////////////////////////////////////////////////////////////////////////// pub use crate::get_stdout_for; //// CONSTANTS ///////////////////////////////////////////////////////////////////////////////////// //// STATICS /////////////////////////////////////////////////////////////////////////////////////// //// MACROS //////////////////////////////////////////////////////////////////////////////////////// /// ## catches what the expression would write to the `stdout` /// /// This macro takes an expression, executes it, and catches what it would write to the stdout. /// The buffer of the stdout will then be returned for further use. /// /// This is especially useful when testing loggers or other frontend CLI functions. /// /// Inspiration: [users.rust-lang.org](https://users.rust-lang.org/t/how-to-test-functions-that-use-println/67188/5) #[macro_export] macro_rules! get_stdout_for { ($test:expr) => {{ use gag::BufferRedirect; use std::io::Read; let mut buf = BufferRedirect::stdout().unwrap(); $test; let mut output = String::new(); buf.read_to_string(&mut output).unwrap(); drop(buf); output }}; } //// ENUMS ///////////////////////////////////////////////////////////////////////////////////////// //// STRUCTS /////////////////////////////////////////////////////////////////////////////////////// //// IMPLEMENTATION //////////////////////////////////////////////////////////////////////////////// //// PUBLIC FUNCTIONS ////////////////////////////////////////////////////////////////////////////// //// PRIVATE FUNCTIONS /////////////////////////////////////////////////////////////////////////////