const_str/__ctfe/
to_byte_array.rs

1pub struct ToByteArray<T>(pub T);
2
3impl ToByteArray<&str> {
4    pub const fn const_eval<const N: usize>(&self) -> [u8; N] {
5        crate::bytes::clone(self.0.as_bytes())
6    }
7}
8
9impl<const L: usize> ToByteArray<&[u8; L]> {
10    pub const fn const_eval<const N: usize>(&self) -> [u8; N] {
11        crate::bytes::clone(self.0)
12    }
13}
14
15/// Converts a string slice or a byte string to a byte array.
16///
17/// This macro is [const-context only](./index.html#const-context-only).
18///
19/// # Examples
20/// ```
21/// const S: &str = "hello";
22/// const B: &[u8; 6] = b"hello\0";
23/// assert_eq!(const_str::to_byte_array!(S), [b'h', b'e', b'l', b'l', b'o']);
24/// assert_eq!(const_str::to_byte_array!(B), [b'h', b'e', b'l', b'l', b'o', b'\0']);
25/// ```
26///
27#[macro_export]
28macro_rules! to_byte_array {
29    ($s: expr) => {{
30        const OUTPUT_LEN: usize = $s.len();
31        $crate::__ctfe::ToByteArray($s).const_eval::<OUTPUT_LEN>()
32    }};
33}
34
35#[cfg(test)]
36mod tests {
37    use super::*;
38
39    #[test]
40    fn test_to_byte_array() {
41        const S: &str = "hello";
42        const B: &[u8; 6] = b"hello\0";
43        const R1: [u8; 5] = to_byte_array!(S);
44        const R2: [u8; 6] = to_byte_array!(B);
45
46        assert_eq!(R1, [b'h', b'e', b'l', b'l', b'o']);
47        assert_eq!(R2, [b'h', b'e', b'l', b'l', b'o', b'\0']);
48
49        const EMPTY: &str = "";
50        const R3: [u8; 0] = to_byte_array!(EMPTY);
51        assert_eq!(R3, []);
52
53        const BYTES: &[u8; 3] = b"abc";
54        const R4: [u8; 3] = to_byte_array!(BYTES);
55        assert_eq!(R4, [b'a', b'b', b'c']);
56    }
57
58    #[test]
59    fn test_to_byte_array_runtime() {
60        // Runtime tests for ToByteArray with &str
61        let to_arr_str = ToByteArray("test");
62        let result: [u8; 4] = to_arr_str.const_eval();
63        assert_eq!(result, [b't', b'e', b's', b't']);
64
65        // Runtime tests for ToByteArray with &[u8; N]
66        let arr: &[u8; 3] = b"xyz";
67        let to_arr_bytes = ToByteArray(arr);
68        let result2: [u8; 3] = to_arr_bytes.const_eval();
69        assert_eq!(result2, [b'x', b'y', b'z']);
70
71        // Test empty
72        let to_arr_empty = ToByteArray("");
73        let result3: [u8; 0] = to_arr_empty.const_eval();
74        assert_eq!(result3, []);
75    }
76}