1 | #[allow (unused_imports)] |
2 | use crate as defmt; |
3 | use crate::{Format, Formatter, Str}; |
4 | |
5 | pub trait Truncate<U> { |
6 | fn truncate(self) -> U; |
7 | } |
8 | |
9 | macro_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. |
21 | impl_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)] |
40 | pub struct NoneError; |
41 | |
42 | impl 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!`] |
58 | pub trait IntoResult { |
59 | type Ok; |
60 | type Error; |
61 | fn into_result(self) -> Result<Self::Ok, Self::Error>; |
62 | } |
63 | |
64 | impl<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(err:NoneError) |
71 | } |
72 | } |
73 | |
74 | impl<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 | } |
83 | |