const_panic/fmt_impls/
fmt_range.rs

1use crate::{FmtArg, PanicFmt, PanicVal, StdWrapper};
2
3use core::ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive};
4
5macro_rules! impl_range_panicfmt_one {
6    (
7        fn(&$self:ident: $ty:ty, $f:ident) -> $pv_count:literal {
8            $($content:tt)*
9        }
10    ) => {
11        impl PanicFmt for $ty {
12            type This = Self;
13            type Kind = crate::fmt::IsStdType;
14            const PV_COUNT: usize = $pv_count;
15        }
16
17        impl crate::StdWrapper<&$ty> {
18            #[doc = concat!(
19                "Converts this `", stringify!($ty), "` to a single-element `PanicVal` array."
20            )]
21            pub const fn to_panicvals($self, $f: FmtArg) -> [PanicVal<'static>; $pv_count] {
22                $($content)*
23            }
24        }
25    }
26}
27
28macro_rules! impl_range_panicfmt {
29    ($elem_ty:ty) => {
30        impl_range_panicfmt_one! {
31            fn(&self: Range<$elem_ty>, f) -> 3 {
32                [
33                    StdWrapper(&self.0.start).to_panicval(f),
34                    PanicVal::write_str(".."),
35                    StdWrapper(&self.0.end).to_panicval(f),
36                ]
37            }
38        }
39
40        impl_range_panicfmt_one! {
41            fn(&self: RangeFrom<$elem_ty>, f) -> 2 {
42                [
43                    StdWrapper(&self.0.start).to_panicval(f),
44                    PanicVal::write_str(".."),
45                ]
46            }
47        }
48
49        impl_range_panicfmt_one! {
50            fn(&self: RangeTo<$elem_ty>, f) -> 2 {
51                [
52                    PanicVal::write_str(".."),
53                    StdWrapper(&self.0.end).to_panicval(f),
54                ]
55            }
56        }
57
58        impl_range_panicfmt_one! {
59            fn(&self: RangeToInclusive<$elem_ty>, f) -> 2 {
60                [
61                    PanicVal::write_str("..="),
62                    StdWrapper(&self.0.end).to_panicval(f),
63                ]
64            }
65        }
66
67        impl_range_panicfmt_one! {
68            fn(&self: RangeInclusive<$elem_ty>, f) -> 3 {
69                [
70                    StdWrapper(self.0.start()).to_panicval(f),
71                    PanicVal::write_str("..="),
72                    StdWrapper(self.0.end()).to_panicval(f),
73                ]
74            }
75        }
76    };
77}
78
79impl_range_panicfmt! {usize}
80
81////////////////////////////////////////////////////////////////////////////////
82
83impl_range_panicfmt_one! {
84    fn(&self: RangeFull, _f) -> 1 {
85        [PanicVal::write_str("..")]
86    }
87}