#fmt #formatting #debugging #extenstion

fmt_ext

A simple interface for extending external types with custom implementations of Debug and Display traits

3 releases

0.1.2 Sep 16, 2021
0.1.1 Jul 15, 2021
0.1.0 Jun 29, 2021

#256 in Value formatting

MIT license

10KB
69 lines

fmt_ext

Crates.io docs.rs

A simple interface for extending external types with custom implementations of Debug and Display traits.

The example below shows how implement custom debug formatting for slices that additionally print their length.

use std::{fmt, marker::PhantomData};

use fmt_ext::{debug::*, DebugExt};

// Create a type that will implement custom debug...
struct SliceWithLenDebug<T>(PhantomData<T>);

// Implement custom debug...
impl<T> CustomDebug for SliceWithLenDebug<T>
where
    T: fmt::Debug,
{
    type Target = [T];

    fn fmt_target(target: &Self::Target, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "Slice {{ len: {}, items: {:?} }}", target.len(), target)
    }
}

// Attach custom debug implementation to the target type...
impl<T> AttachDebug<SliceWithLenDebug<T>> for [T] {}

// Look! Now we have just call `debug` method on the target type...
fn main() {
    let numbers = [0, 1, 2, 3];
    println!("{:?}", numbers.debug());

    let strings = vec!["I", "am", "a", "custom", "debug"];
    println!("{:?}", strings.debug());
}

All examples are in this directory.

Support of #![no_std]

fmt_ext supports #![no_std] mode by default.

License

fmt_ext is distributed under the terms of the MIT license.

No runtime deps