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 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.
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
.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.