Crates.io | fmt_ext |
lib.rs | fmt_ext |
version | 0.1.2 |
source | src |
created_at | 2021-06-29 12:48:06.860898 |
updated_at | 2021-09-16 15:53:43.726503 |
description | A simple interface for extending external types with custom implementations of `Debug` and `Display` traits. |
homepage | |
repository | https://github.com/ilyavenner/fmt_ext |
max_upload_size | |
id | 416144 |
size | 12,083 |
fmt_ext
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.
#![no_std]
fmt_ext
supports #![no_std]
mode by default.
fmt_ext
is distributed under the terms of the MIT license.