const_str/__ctfe/
to_char_array.rs

1pub struct ToCharArray<T>(pub T);
2
3impl ToCharArray<&str> {
4    pub const fn output_len(&self) -> usize {
5        crate::utf8::str_count_chars(self.0)
6    }
7
8    pub const fn const_eval<const N: usize>(&self) -> [char; N] {
9        crate::utf8::str_chars(self.0)
10    }
11}
12
13/// Converts a string slice into an array of its characters.
14///
15/// This macro is [const-context only](./index.html#const-context-only).
16///
17/// # Examples
18/// ```
19/// const CHARS: [char; 5] = const_str::to_char_array!("Hello");
20/// assert_eq!(CHARS, ['H', 'e', 'l', 'l', 'o']);
21/// ```
22///
23#[macro_export]
24macro_rules! to_char_array {
25    ($s: expr) => {{
26        const OUTPUT_LEN: usize = $crate::__ctfe::ToCharArray($s).output_len();
27        const OUTPUT_BUF: [char; OUTPUT_LEN] =
28            $crate::__ctfe::ToCharArray($s).const_eval::<OUTPUT_LEN>();
29        OUTPUT_BUF
30    }};
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36
37    #[test]
38    fn test_to_char_array() {
39        const CHARS: [char; 5] = to_char_array!("Hello");
40        assert_eq!(CHARS, ['H', 'e', 'l', 'l', 'o']);
41
42        const EMPTY: [char; 0] = to_char_array!("");
43        assert_eq!(EMPTY, []);
44
45        const UNICODE: [char; 3] = to_char_array!("你好!");
46        assert_eq!(UNICODE, ['你', '好', '!']);
47
48        const SINGLE: [char; 1] = to_char_array!("A");
49        assert_eq!(SINGLE, ['A']);
50    }
51
52    #[test]
53    fn test_to_char_array_runtime() {
54        // Runtime tests for ToCharArray
55        let to_arr = ToCharArray("test");
56        assert_eq!(to_arr.output_len(), 4);
57        let result: [char; 4] = to_arr.const_eval();
58        assert_eq!(result, ['t', 'e', 's', 't']);
59
60        let to_arr_unicode = ToCharArray("你好");
61        assert_eq!(to_arr_unicode.output_len(), 2);
62        let result2: [char; 2] = to_arr_unicode.const_eval();
63        assert_eq!(result2, ['你', '好']);
64
65        let to_arr_empty = ToCharArray("");
66        assert_eq!(to_arr_empty.output_len(), 0);
67        let result3: [char; 0] = to_arr_empty.const_eval();
68        assert_eq!(result3, []);
69
70        let to_arr_emoji = ToCharArray("🎉");
71        assert_eq!(to_arr_emoji.output_len(), 1);
72        let result4: [char; 1] = to_arr_emoji.const_eval();
73        assert_eq!(result4, ['🎉']);
74    }
75}