use crate::fdb::error::{FdbError, FdbQueryErrorReason, FdbResult};
use bytes::{Bytes, BytesMut};
pub fn range_end_for_prefix(prefix: &[u8]) -> FdbResult<Vec<u8>> {
range_end_for_prefix_bytes(prefix).map(|value| value.to_vec())
}
pub fn range_end_for_prefix_bytes(prefix: &[u8]) -> FdbResult<Bytes> {
if prefix.is_empty() {
return Err(FdbError::Query {
reason: FdbQueryErrorReason::InvalidRangePrefix,
});
}
let mut end = BytesMut::from(prefix);
for index in (0..end.len()).rev() {
if end[index] != 0xff {
end[index] = end[index].checked_add(1).ok_or(FdbError::Query {
reason: FdbQueryErrorReason::IntegerOverflow,
})?;
end.truncate(index.checked_add(1).ok_or(FdbError::Query {
reason: FdbQueryErrorReason::IntegerOverflow,
})?);
return Ok(end.freeze());
}
}
Err(FdbError::Query {
reason: FdbQueryErrorReason::InvalidRangePrefix,
})
}
#[cfg(test)]
#[path = "range_tests.rs"]
mod tests;