fmt_ext

Crates.iofmt_ext
lib.rsfmt_ext
version0.1.2
sourcesrc
created_at2021-06-29 12:48:06.860898
updated_at2021-09-16 15:53:43.726503
descriptionA simple interface for extending external types with custom implementations of `Debug` and `Display` traits.
homepage
repositoryhttps://github.com/ilyavenner/fmt_ext
max_upload_size
id416144
size12,083
Ilya Venner (ilyavenner)

documentation

README

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.

Commit count: 5

cargo fmt