use bytes::{BufMut, Bytes, BytesMut};
const TS_SIZE: usize = 8;
const SUFFIX_SIZE: usize = TS_SIZE * 2;
pub(crate) fn session_key(key_bytes: &[u8], start: i64, end: i64) -> Bytes {
let mut b = BytesMut::with_capacity(key_bytes.len() + SUFFIX_SIZE);
b.extend_from_slice(key_bytes);
b.put_i64(end);
b.put_i64(start);
b.freeze()
}
pub(crate) fn session_end_of(k: &[u8]) -> i64 {
let n = k.len();
i64::from_be_bytes(k[n - SUFFIX_SIZE..n - TS_SIZE].try_into().expect("8 bytes"))
}
pub(crate) fn session_start_of(k: &[u8]) -> i64 {
let n = k.len();
i64::from_be_bytes(k[n - TS_SIZE..].try_into().expect("8 bytes"))
}
pub(crate) fn session_key_bytes_of(k: &[u8]) -> &[u8] {
&k[..k.len() - SUFFIX_SIZE]
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn session_key_layout_end_first() {
let k = session_key(b"k", 5, 9); assert_eq!(k.len(), 17); assert_eq!(&k[1..9], &9i64.to_be_bytes()); assert_eq!(&k[9..17], &5i64.to_be_bytes()); assert_eq!(session_end_of(&k), 9);
assert_eq!(session_start_of(&k), 5);
assert_eq!(session_key_bytes_of(&k), b"k");
}
#[test]
fn sorts_by_end_then_start() {
let lo = session_key(b"k", 0, 5);
let hi = session_key(b"k", 0, 7);
assert!(hi > lo);
let a = session_key(b"k", 3, 9);
let b = session_key(b"k", 4, 9);
assert!(b > a);
}
}