1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//! Traits that provide a custom [Debug].
//!
//! # Example
//!
//! 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! We have just call `debug` method on target type...
//! let numbers = [0, 1, 2, 3];
//! println!("{:?}", numbers.debug());
//!
//! let strings = vec!["I", "am", "a", "custom", "debug"];
//! println!("{:?}", strings.debug());
//! ```
//!
//! [Debug]: core::fmt::Debug
use fmt;
/// A marker that helps compiler find the [CustomDebug] implementation.
/// A trait that proxying a custom [Debug] for a target type.
///
/// [Debug]: fmt::Debug