# icecream-rs [![Build Status](https://travis-ci.org/ericchang00/icecream-rs.svg?branch=master)](https://travis-ci.org/ericchang00/icecream-rs)![](https://img.shields.io/crates/v/icecream-rs.svg) Print debugging with inspection for Rust, inspired by [icecream](https://github.com/gruns/icecream) for Python. I tend to use a lot of print debugging when writing Rust. `icecream` provides the `ic!()` and `ice!()` macros to make print debugging more convenient, by formatting print statements with helpful information like: - line number - calling function - module name - file name ### Debugging with `ic!()` ```rust // src/example.rs #[macro_use] extern crate icecream; mod a_module { fn some_function() { let x = Some(99); ic!(); ic!(x); ic!(x.unwrap() + 1); ice!(); } } ``` #### Plain `ic!()` prints the filename and line number. ``` example.rs:8 ❯ ``` #### Matching on an identifier `ic!(x)` prints the name of the variable and the value formatted with `std::fmt::Debug`. ``` example.rs:9 ❯ x = Some(99) ``` #### Matching on an expression `ic!(x.unwrap() + 1)` evaluates the inner expression and prints the resulting value. ``` example.rs:10 ❯ x.unwrap() + 1 = 100 ``` #### Printing more information `ice!()` prints a longer output that includes the calling module and function. ``` example.rs::a_module::some_function:11 ❯ ``` ### Configuring `ic!()` You can also configure the characters used for symbols in the print output. ```rs // main.rs #[macro_use] extern crate icecream; fn main() { icecream::set_equals_symbol(" -> "); let x = 1; ic!(x); } ``` ``` main.rs:7 ❯ x -> 1 ``` ### Tests Tests *must* be run single-threaded with the `--nocapture` flag. ``` RUST_TEST_THREADS=1 cargo test -- --nocapture ```