2 unstable releases
0.2.0 | Aug 18, 2022 |
---|---|
0.1.0 | Aug 17, 2022 |
#593 in Debugging
8KB
135 lines
visual
Use the Display
trait if it's satisfied, fallback to Debug
otherwise, and
if neither are implemented use a default string value.
Why
The typical "nice" way to display things is via the Display
trait. However, sometimes
this trait is not available, but Debug
is. Debug
is easy to derive. In those cases
it would be nice to use Debug
as a fallback.
Usage
use visual::{vis, Visual};
fn main() {
// The `vis!` macro wraps your type in such a way that it can decide which trait to
// use: `Display`, `Debug` or neither
printer(vis!("hello")); // `&str` implements `Display`, so use it
printer(vis!(vec![1, 2, 3])); // `Vec` does not, but it impls `Debug`, so we use that
struct MyStruct;
printer(vis!(MyStruct)); // `MyStruct` impls neither, so we use a default string value
}
fn printer<T>(t: Visual<T>) { // Use the `Visual` wrapper around your type
println!("{}", t.get_display()); // Use `get_display` to get a string representation of your type
}
If neither trait is implemented, the string representation will be the one defined by
visual::get_non_displayable_string()
. This default label can be initialized to a custom value
once, by calling visual::set_non_displayable_string("value")
.
Credits
For the magic to work, I use the "autoderef hack" proposed by Lukas Kalbertodt, which in turn is based on David Tolnay's technique.
Links
- Documentation: docs.rs
- Crate: crates.io
- Repository: github.com