defmt/impls/
adapter.rs

1use core::fmt;
2
3use crate as defmt;
4use crate::{export, Format, Formatter, Str};
5
6/// An "adapter" type to feed `Debug` values into defmt macros, which expect `defmt::Format` values.
7///
8/// This adapter disables compression and uses the `core::fmt` code on-device! You should prefer
9/// `defmt::Format` over `Debug` whenever possible.
10///
11/// # Examples
12///
13/// ```rust
14/// # #[derive(Debug)]
15/// # struct ExpensiveThing();
16/// # let expensive_thing = ExpensiveThing();
17/// #
18/// defmt::info!("{:?}", defmt::Debug2Format(&expensive_thing));
19/// //                                        ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ
20/// //                                        must `#[derive(Debug)]`
21/// ```
22///
23/// Note that any provided defmt display hints will be ignored
24/// because this always uses `{:?}` to format the contained value.
25pub struct Debug2Format<'a, T: fmt::Debug + ?Sized>(pub &'a T);
26
27impl<T: fmt::Debug + ?Sized> fmt::Debug for Debug2Format<'_, T> {
28    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> Result<(), core::fmt::Error> {
29        self.0.fmt(fmt)
30    }
31}
32
33impl<T: fmt::Debug + ?Sized> Format for Debug2Format<'_, T> {
34    default_format!();
35
36    fn _format_tag() -> Str {
37        defmt_macros::internp!("{=__internal_Debug}")
38    }
39
40    fn _format_data(&self) {
41        export::debug(&self.0);
42    }
43}
44
45/// An "adapter" type to feed `Display` values into defmt macros, which expect `defmt::Format` values.
46///
47/// This adapter disables compression and uses the `core::fmt` code on-device! You should prefer
48/// `defmt::Format` over `Display` whenever possible.
49///
50/// # Examples
51///
52/// ```rust
53/// # struct ExpensiveThing();
54/// #
55/// # impl core::fmt::Display for ExpensiveThing {
56/// #     fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
57/// #         write!(f, "{}", "expensive")
58/// #     }
59/// #  }
60/// # let expensive_thing = ExpensiveThing();
61/// #
62/// defmt::info!("{}", defmt::Display2Format(&expensive_thing));
63/// //                                        ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ
64/// //                                        must implement `fmt::Display`
65/// ```
66///
67/// Note that any provided defmt display hints will be ignored
68/// because this always uses `{}` to format the contained value.
69pub struct Display2Format<'a, T: fmt::Display + ?Sized>(pub &'a T);
70
71impl<T: fmt::Display + ?Sized> fmt::Display for Display2Format<'_, T> {
72    fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> Result<(), core::fmt::Error> {
73        self.0.fmt(fmt)
74    }
75}
76
77impl<T: fmt::Display + ?Sized> Format for Display2Format<'_, T> {
78    default_format!();
79
80    fn _format_tag() -> Str {
81        defmt_macros::internp!("{=__internal_Display}")
82    }
83
84    fn _format_data(&self) {
85        export::display(&self.0);
86    }
87}