const_panic/macros/
concat_macro.rs

1use crate::ArrayString;
2
3use typewit::{MakeTypeWitness, TypeEq, TypeWitnessTypeArg};
4
5/// Concatenates [`PanicFmt`] constants into a `&'static str`
6///
7/// This formats arguments the same as the [`concat_panic`] macro,
8/// also requiring the arguments to be constant expressions.
9///
10/// # Example
11///
12/// ### Basic
13///
14/// ```rust
15/// use const_panic::concat_;
16///
17/// assert_eq!(concat_!("array: ", &[3u8, 5, 8, 13]), "array: [3, 5, 8, 13]");
18///
19/// ```
20///
21/// ### Formatted
22///
23/// ```rust
24/// use const_panic::concat_;
25///
26/// assert_eq!(concat_!({?}: get_message(), {}: get_message()), r#""hello"hello"#);
27///
28/// const fn get_message() -> &'static str {
29///     "hello"
30/// }
31///
32/// ```
33///
34/// [`PanicFmt`]: crate::fmt::PanicFmt
35/// [`concat_panic`]: macro@crate::concat_panic
36///
37#[cfg_attr(feature = "docsrs", doc(cfg(feature = "non_basic")))]
38#[macro_export]
39macro_rules! concat_ {
40    () => ("");
41    ($($args:tt)*) => ({
42        const fn __func_zxe7hgbnjs<Ret_ZXE7HGBNJS, const CAP_ZXE7HGBNJS: $crate::__::usize>(
43            cmd: $crate::__::ConcatCmd<Ret_ZXE7HGBNJS, CAP_ZXE7HGBNJS>
44        ) -> Ret_ZXE7HGBNJS {
45            $crate::__concat_func_setup!{
46                (|args| {
47                    match cmd {
48                        $crate::__::ConcatCmd::ComputeLength(te) =>
49                            te.to_left($crate::__::compute_length(args)),
50                        $crate::__::ConcatCmd::BuildArray(te) =>
51                            te.to_left($crate::__::make_panic_string_unwrapped(args)),
52                    }
53                })
54                []
55                [$($args)*,]
56            }
57        }
58
59        const LEN_ZXE7HGBNJS: $crate::__::usize = __func_zxe7hgbnjs($crate::__::MakeTypeWitness::MAKE);
60
61        const AS_ZXE7HGBNJS: $crate::ArrayString<LEN_ZXE7HGBNJS> =
62            __func_zxe7hgbnjs($crate::__::MakeTypeWitness::MAKE);
63
64        const S_ZXE7HGBNJS: &$crate::__::str = AS_ZXE7HGBNJS.to_str();
65
66        S_ZXE7HGBNJS
67    })
68}
69
70#[doc(hidden)]
71pub enum ConcatCmd<Ret, const CAP: usize> {
72    ComputeLength(TypeEq<Ret, usize>),
73    BuildArray(TypeEq<Ret, ArrayString<CAP>>),
74}
75
76impl<Ret, const CAP: usize> TypeWitnessTypeArg for ConcatCmd<Ret, CAP> {
77    type Arg = Ret;
78}
79
80impl MakeTypeWitness for ConcatCmd<usize, 0> {
81    const MAKE: Self = Self::ComputeLength(TypeEq::NEW);
82}
83
84impl<const CAP: usize> MakeTypeWitness for ConcatCmd<ArrayString<CAP>, CAP> {
85    const MAKE: Self = Self::BuildArray(TypeEq::NEW);
86}