use nodedb_types::Namespace;
pub(crate) fn prefix_key(ns: Namespace, key: &[u8]) -> Vec<u8> {
let mut k = Vec::with_capacity(1 + key.len());
k.push(ns as u8);
k.extend_from_slice(key);
k
}
pub(crate) enum KeyBuf {
Stack { data: [u8; 64], len: usize },
Heap(Vec<u8>),
}
impl KeyBuf {
#[inline]
pub(crate) fn new(ns: Namespace, key: &[u8]) -> Self {
let total = 1 + key.len();
if total <= 64 {
let mut data = [0u8; 64];
data[0] = ns as u8;
data[1..total].copy_from_slice(key);
KeyBuf::Stack { data, len: total }
} else {
let mut v = Vec::with_capacity(total);
v.push(ns as u8);
v.extend_from_slice(key);
KeyBuf::Heap(v)
}
}
#[inline]
pub(crate) fn as_slice(&self) -> &[u8] {
match self {
KeyBuf::Stack { data, len } => &data[..*len],
KeyBuf::Heap(v) => v.as_slice(),
}
}
}
pub(crate) fn strip_prefix(composite: &[u8]) -> &[u8] {
if composite.len() > 1 {
&composite[1..]
} else {
&[]
}
}
pub(crate) fn ns_end(ns: Namespace) -> Vec<u8> {
let b = ns as u8;
assert!(
b < 0xFF,
"Namespace byte 0xFF would overflow the single-byte end-marker; \
add a two-byte sentinel before assigning Namespace values in the 0xFF range"
);
vec![b + 1]
}