use crate::tuple::Bytes;
use std::borrow::Cow;
#[derive(Clone, Debug)]
pub struct KeySelector<'a> {
key: Bytes<'a>,
or_equal: bool,
offset: i32,
}
impl<'a> KeySelector<'a> {
pub const fn new(key: Cow<'a, [u8]>, or_equal: bool, offset: i32) -> Self {
Self {
key: Bytes(key),
or_equal,
offset,
}
}
pub fn key(&self) -> &[u8] {
self.key.as_ref()
}
pub fn or_equal(&self) -> bool {
self.or_equal
}
pub fn offset(&self) -> i32 {
self.offset
}
pub fn last_less_than<K: Into<Cow<'a, [u8]>>>(key: K) -> Self {
Self::new(key.into(), false, 0)
}
pub fn last_less_or_equal<K: Into<Cow<'a, [u8]>>>(key: K) -> Self {
Self::new(key.into(), true, 0)
}
pub fn first_greater_than<K: Into<Cow<'a, [u8]>>>(key: K) -> Self {
Self::new(key.into(), true, 1)
}
pub fn first_greater_or_equal<K: Into<Cow<'a, [u8]>>>(key: K) -> Self {
Self::new(key.into(), false, 1)
}
fn make_key(&mut self, key: &[u8]) {
match &mut self.key {
Bytes(Cow::Borrowed(..)) => self.key = Bytes::from(key.to_owned()),
Bytes(Cow::Owned(vec)) => {
vec.clear();
vec.extend_from_slice(key);
}
};
}
pub(crate) fn make_first_greater_or_equal(&mut self, key: &[u8]) {
self.make_key(key);
self.or_equal = false;
self.offset = 1;
}
pub(crate) fn make_first_greater_than(&mut self, key: &[u8]) {
self.make_key(key);
self.or_equal = true;
self.offset = 1;
}
}