use crate::keyspace::config::{DecodeConfig, EncodeConfig};
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
impl EncodeConfig for crate::config::BlockSizePolicy {
fn encode(&self) -> crate::Slice {
let mut v = vec![];
#[expect(clippy::cast_possible_truncation)]
#[expect(clippy::expect_used)]
v.write_u8(self.len() as u8)
.expect("cannot fail writing into a vec");
for item in self.iter() {
#[expect(clippy::expect_used)]
v.write_u32::<LittleEndian>(*item)
.expect("cannot fail writing into a vec");
}
v.into()
}
}
impl DecodeConfig for crate::config::BlockSizePolicy {
fn decode(mut bytes: &[u8]) -> crate::Result<Self> {
let len = bytes.read_u8()?;
let mut v = vec![];
for _ in 0..len {
v.push(bytes.read_u32::<LittleEndian>()?);
}
Ok(Self::new(v))
}
}
#[cfg(test)]
mod tests {
use super::*;
use test_log::test;
#[test]
fn roundtrip_block_size_policy() -> crate::Result<()> {
let policy = crate::config::BlockSizePolicy::new([1024, 2048, 4096]);
let encoded = policy.encode();
let decoded = crate::config::BlockSizePolicy::decode(&encoded)?;
assert_eq!(policy, decoded);
Ok(())
}
}