const_str/__ctfe/
to_byte_array.rs1pub 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#[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 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 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 let to_arr_empty = ToByteArray("");
73 let result3: [u8; 0] = to_arr_empty.const_eval();
74 assert_eq!(result3, []);
75 }
76}