Skip to content

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

License

Notifications You must be signed in to change notification settings

ilyavennik/fmt-ext

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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.

About

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

Resources

License

Stars

Watchers

Forks

Languages