Trait const_panic::fmt::PanicFmt
source · pub trait PanicFmt {
type This: ?Sized;
type Kind;
const PV_COUNT: usize;
const PROOF: IsPanicFmt<Self, Self::This, Self::Kind> = IsPanicFmt::NEW;
}
Expand description
Trait for types that can be formatted by const panics.
Implementor
Implementors are expected to also define this inherent method to format the type:
const fn to_panicvals<'a>(&'a self, f: FmtArg) -> [PanicVal<'a>; <Self as PanicFmt>::PV_COUNT]
The returned PanicVal
can also be PanicVal<'static>
.
Implementation examples
This trait can be implemented in these ways (in increasing order of verbosity):
- Using the
PanicFmt
derive macro (requires the opt-in"derive"
feature) - Using the
impl_panicfmt
macro (requires the default-enabled"non_basic"
feature) - Using the
flatten_panicvals
macro (requires the default-enabled"non_basic"
feature) - Using no macros at all
Macro-less impl
Implementing this trait for a simple enum without using macros.
use const_panic::{ArrayString, FmtArg, PanicFmt, PanicVal};
// `ArrayString` requires the "non_basic" crate feature (enabled by default),
// everything else in this example works with no enabled crate features.
assert_eq!(
ArrayString::<99>::concat_panicvals(&[
&Foo::Bar.to_panicvals(FmtArg::DEBUG),
&[PanicVal::write_str(",")],
&Foo::Baz.to_panicvals(FmtArg::DEBUG),
&[PanicVal::write_str(",")],
&Foo::Qux.to_panicvals(FmtArg::DEBUG),
]).unwrap(),
"Bar,Baz,Qux",
);
enum Foo {
Bar,
Baz,
Qux,
}
impl PanicFmt for Foo {
type This = Self;
type Kind = const_panic::IsCustomType;
const PV_COUNT: usize = 1;
}
impl Foo {
pub const fn to_panicvals(self, _: FmtArg) -> [PanicVal<'static>; Foo::PV_COUNT] {
match self {
Self::Bar => [PanicVal::write_str("Bar")],
Self::Baz => [PanicVal::write_str("Baz")],
Self::Qux => [PanicVal::write_str("Qux")],
}
}
}
Required Associated Types§
sourcetype This: ?Sized
type This: ?Sized
The type after dereferencing all references.
User-defined types should generally set this to Self
.
sourcetype Kind
type Kind
Whether this is a user-defined type or standard library type.
User-defined types should generally set this to IsCustomType
.
Required Associated Constants§
Provided Associated Constants§
sourceconst PROOF: IsPanicFmt<Self, Self::This, Self::Kind> = IsPanicFmt::NEW
const PROOF: IsPanicFmt<Self, Self::This, Self::Kind> = IsPanicFmt::NEW
A marker type that proves that Self
implements PanicFmt
.
Used by const_panic macros to coerce both standard library and
user-defined types into some type that has a to_panicvals
method.
Implementations on Foreign Types§
source§impl PanicFmt for PhantomPinned
impl PanicFmt for PhantomPinned
source§impl PanicFmt for NonZeroI128
impl PanicFmt for NonZeroI128
source§impl PanicFmt for NonZeroIsize
impl PanicFmt for NonZeroIsize
source§impl PanicFmt for NonZeroUsize
impl PanicFmt for NonZeroUsize
source§impl PanicFmt for NonZeroU16
impl PanicFmt for NonZeroU16
source§impl PanicFmt for RangeInclusive<usize>
impl PanicFmt for RangeInclusive<usize>
source§impl PanicFmt for NonZeroU32
impl PanicFmt for NonZeroU32
source§impl PanicFmt for NonZeroU64
impl PanicFmt for NonZeroU64
source§impl PanicFmt for NonZeroI16
impl PanicFmt for NonZeroI16
source§impl<T> PanicFmt for Option<T>where
T: PanicFmt,
impl<T> PanicFmt for Option<T>where T: PanicFmt,
Note: there is only to_panicvals
methods for Option
s of standard library types
for now.