Crate gag[−][src]
Temporarily redirect stdout/stderr.
For example, one can temporarily throw away stdout output:
use gag::Gag; println!("Hello world!"); { let print_gag = Gag::stdout().unwrap(); println!("No one will see this!"); println!("Or this!"); } println!("But they will see this!");
You can also temporarily un-gag by dropping the gag:
use gag::Gag; let mut print_gag = Gag::stdout().unwrap(); println!("No one will see this!"); if true { drop(print_gag); println!("They will see this..."); print_gag = Gag::stdout().unwrap(); println!("Not this..."); } println!("Nor this.");
However, you can’t open multiple Gags/Redirects/Holds for the same output at once:
use gag::Gag; // Multiple stdout gags let gag_a = Gag::stdout().unwrap(); let gag_b_result = Gag::stdout(); assert!(gag_b_result.is_err()); assert_eq!(gag_b_result.err().expect("Expected an error").kind(), std::io::ErrorKind::AlreadyExists); // However, you can still gag stderr: let gag_c = Gag::stderr().unwrap();
If you don’t want to throw away stdout, you can write it to a file:
use std::fs::OpenOptions; use std::io::{Read, Write, Seek, SeekFrom}; use gag::Redirect; println!("Displayed"); // Open a log let log = OpenOptions::new() .truncate(true) .read(true) .create(true) .write(true) .open("/tmp/my_log.log") .unwrap(); let print_redirect = Redirect::stdout(log).unwrap(); println!("Hidden"); // Extract redirect let mut log = print_redirect.into_inner(); println!("Displayed"); let mut buf = String::new(); log.seek(SeekFrom::Start(0)).unwrap(); log.read_to_string(&mut buf).unwrap(); assert_eq!(&buf[..], "Hidden\n");
Alternatively, you can buffer stdout to a temporary file. On linux 3.11+, this file is guarenteed to be stored in-memory.
use std::io::Read; use gag::BufferRedirect; let mut buf = BufferRedirect::stdout().unwrap(); println!("Hello world!"); let mut output = String::new(); buf.read_to_string(&mut output).unwrap(); assert_eq!(&output[..], "Hello world!\n");
Finally, if you just want to temporarily hold std output, you can use Hold
to hold the output
until dropped:
use gag::Hold; let hold = Hold::stdout().unwrap(); println!("first"); println!("second"); drop(hold); // printing happens here!
Structs
Buffer | An in-memory read-only buffer into which BufferRedirect buffers output. |
BufferRedirect | Buffer output in an in-memory buffer. |
Gag | Discard output until dropped. |
Hold | Hold output until dropped. On drop, the held output is sent to the stdout/stderr. |
Redirect | Redirect stderr/stdout to a file. |
RedirectError |