#printing

behold

A simple library enabling contextual debugging

4 releases

Uses old Rust 2015

0.1.3 Jul 21, 2018
0.1.2 Jun 26, 2018
0.1.1 Jun 26, 2018
0.1.0 Jun 26, 2018

#718 in Debugging

MIT license

11KB
88 lines

Build Status

Behold

A simple library to aide in contextual debugging. This is a partial Rust port of the Python Behold library.

Documentation

API documentation is available here.

Changelog is available here.

Core Concepts

Sometimes print debugging is the best way to examine the state of a running program. But frequently you only care about the prints in a particular code path. With Behold, one part of the program can control debugging in another.

All Behold instances share the same global context to control what to print. However, a Behold instance can be created and configured to determine how or what it prints.

Contextual Debugging

BEHOLD.show("testing".to_string()) will print "testing" to the screen. BEHOLD.when(true).show("testing".to_string()) will print "testing" to the screen. BEHOLD.when(false).show("testing".to_string()) will do nothing. BEHOLD.when_context("key").show("testing".to_string()) will print "testing" to the screen but only if the "testing" key has been set to true previously.

extern crate behold;

use behold::behold;

fn f(idx: usize) {
    behold().show(format!("Hello from f({})!", idx));
}

fn f2(idx: usize) {
    // Do something hard to debug
    behold().when(idx % 2 == 0).show(format!("Hello from f2({})!", idx));
}

fn f3(idx: usize) {
    // Do something hard to debug
    behold().when_context(format!("f3-{}", idx).as_str()).show(format!("Hello from f3({})!", idx));
}

fn main() {
    for i in 0..3 {
        println!("\n");
        f(i);
        f2(i);
        f3(i);
        // Context is global
        behold().set_context("f3-1", true);
    }
}

Produces the output:

Behold: Hello from f(0)!
Behold: Hello from f2(0)!


Behold: Hello from f(1)!
Behold: Hello from f3(1)!


Behold: Hello from f(2)!
Behold: Hello from f2(2)!

Tagged Printing

Each instance of Behold can be configured with a tag to help distinguish output.

extern crate behold;

use behold::behold;

fn main() {
    behold().tag("yolo").show("Hello world!".to_string());
}

Produces the output:

Hello world!, yolo

Contextual Execution

Sometimes it's useful to perform some debugging task (such as saving state to a file) when some context is true.

extern crate behold;

use behold::behold;

fn main() {
    behold().call(&|| { println!("Hello world!"); } );
}

Will output:

"Hello world!"

Whereas the following:

extern crate behold;

use behold::behold;

fn main() {
    behold().when(false).call(&|| { println!("Hello world!"); } );
}

Will output nothing.

Dependencies

~0–1.3MB
~17K SLoC