#[cfg(test)]
use sha2::{Digest, Sha256};
#[cfg(test)]
pub(crate) fn length_field(value: impl AsRef<[u8]>) -> [u8; 8] {
let length: u64 = value.as_ref().len().try_into().unwrap();
length.to_le_bytes()
}
#[cfg(test)]
pub(crate) fn sha256(data: impl AsRef<[u8]>) -> [u8; 32] {
let mut state = Sha256::default();
state.update(data.as_ref());
state.finalize().into()
}
#[track_caller]
pub(crate) fn subslice_offsets(haystack: &[u8], needle: &[u8]) -> std::ops::Range<usize> {
let haystack_range = haystack.as_ptr_range();
let needle_range = needle.as_ptr_range();
assert!(
haystack_range.start <= needle_range.start && needle_range.end <= haystack_range.end,
"expected {needle_range:?} to lie within {haystack_range:?}",
);
let start = (needle_range.start as usize)
.checked_sub(haystack_range.start as usize)
.expect("Needle out of range");
let end = (needle_range.end as usize)
.checked_sub(haystack_range.start as usize)
.expect("Needle out of range");
start..end
}