1use bytes::Bytes;
4
5#[inline]
20pub fn namespaced(prefix: &str, key: &[u8]) -> Bytes {
21 let needed = prefix.len() + key.len();
22
23 if needed <= 96 {
25 let mut stack = [0u8; 96];
26 stack[..prefix.len()].copy_from_slice(prefix.as_bytes());
27 stack[prefix.len()..needed].copy_from_slice(key);
28 return Bytes::copy_from_slice(&stack[..needed]);
30 }
31
32 let mut buf = Vec::with_capacity(needed);
34 buf.extend_from_slice(prefix.as_bytes());
35 buf.extend_from_slice(key);
36 Bytes::from(buf)
37}
38
39#[cfg(test)]
40mod tests {
41 use super::*;
42
43 #[test]
44 fn test_namespaced_small_key() {
45 let result = namespaced("prefix:", b"key");
46 assert_eq!(result.as_ref(), b"prefix:key");
47 }
48
49 #[test]
50 fn test_namespaced_empty_prefix() {
51 let result = namespaced("", b"key");
52 assert_eq!(result.as_ref(), b"key");
53 }
54
55 #[test]
56 fn test_namespaced_empty_key() {
57 let result = namespaced("prefix:", b"");
58 assert_eq!(result.as_ref(), b"prefix:");
59 }
60
61 #[test]
62 fn test_namespaced_large_key() {
63 let prefix = "prefix:";
64 let key = vec![b'x'; 100]; let result = namespaced(prefix, &key);
66 assert_eq!(result.len(), prefix.len() + 100);
67 assert!(result.starts_with(b"prefix:"));
68 }
69
70 #[test]
71 fn test_namespaced_exactly_96_bytes() {
72 let prefix = "p:";
73 let key = vec![b'k'; 94]; let result = namespaced(prefix, &key);
75 assert_eq!(result.len(), 96);
76 }
77}