defmt/export/
traits.rs

1#[allow(unused_imports)]
2use crate as defmt;
3use crate::{Format, Formatter, Str};
4
5pub trait Truncate<U> {
6    fn truncate(self) -> U;
7}
8
9macro_rules! impl_truncate {
10    ($($from:ty => $into:ty),*) => {
11        $(impl Truncate<$into> for $from {
12            fn truncate(self) -> $into {
13                self as $into
14            }
15        })*
16    };
17}
18
19// We implement `Truncate<X> for X` so that the macro can unconditionally use it,
20// even if no truncation is performed.
21impl_truncate!(
22    u8   => u8,
23    u16  => u8,
24    u32  => u8,
25    u64  => u8,
26    u128 => u8,
27    u16  => u16,
28    u32  => u16,
29    u64  => u16,
30    u128 => u16,
31    u32  => u32,
32    u64  => u32,
33    u128 => u32,
34    u64  => u64,
35    u128 => u64,
36    u128 => u128
37);
38
39#[derive(Debug, Copy, Clone, Eq, PartialEq)]
40pub struct NoneError;
41
42impl Format for NoneError {
43    fn format(&self, _fmt: Formatter) {
44        unreachable!();
45    }
46
47    fn _format_tag() -> Str {
48        defmt_macros::internp!("Unwrap of a None option value")
49    }
50
51    fn _format_data(&self) {}
52}
53
54/// Transform `self` into a `Result`
55///
56/// # Call sites
57/// * [`defmt::unwrap!`]
58pub trait IntoResult {
59    type Ok;
60    type Error;
61    fn into_result(self) -> Result<Self::Ok, Self::Error>;
62}
63
64impl<T> IntoResult for Option<T> {
65    type Ok = T;
66    type Error = NoneError;
67
68    #[inline]
69    fn into_result(self) -> Result<T, NoneError> {
70        self.ok_or(NoneError)
71    }
72}
73
74impl<T, E> IntoResult for Result<T, E> {
75    type Ok = T;
76    type Error = E;
77
78    #[inline]
79    fn into_result(self) -> Self {
80        self
81    }
82}