use wrecord::{RecordMut, RecordRef};
use crate::{
bftag::BfTag,
error::Result,
meta::{MetaValue, SubKeyRef},
tag::KeyTag,
zset::{ZMemberKeyRef, ZScoreKeyRef, ZSetSubKeyCodec},
};
pub trait RecordValueExt {
fn tag(&self) -> Option<KeyTag>;
fn bftag(&self) -> Option<BfTag>;
fn meta_value(&self) -> Result<MetaValue>;
fn sub_key_ref(&self) -> Result<SubKeyRef<'_>>;
fn zmember_key_ref(&self) -> Result<ZMemberKeyRef<'_>>;
fn zscore_key_ref(&self) -> Result<ZScoreKeyRef<'_>>;
}
#[inline]
fn key_tag(key: &[u8]) -> Option<KeyTag> {
if let [first, ..] = key {
KeyTag::from_repr(*first)
} else {
None
}
}
#[inline]
fn key_bftag(key: &[u8]) -> Option<BfTag> {
if let [first, ..] = key {
BfTag::from_repr(*first)
} else {
None
}
}
impl RecordValueExt for RecordRef<'_> {
#[inline]
fn tag(&self) -> Option<KeyTag> {
key_tag(self.key)
}
#[inline]
fn bftag(&self) -> Option<BfTag> {
key_bftag(self.key)
}
#[inline]
fn meta_value(&self) -> Result<MetaValue> {
MetaValue::from_slice(self.value)
}
#[inline]
fn sub_key_ref(&self) -> Result<SubKeyRef<'_>> {
SubKeyRef::from_slice(self.key)
}
#[inline]
fn zmember_key_ref(&self) -> Result<ZMemberKeyRef<'_>> {
ZSetSubKeyCodec::decode_member_key(self.key)
}
#[inline]
fn zscore_key_ref(&self) -> Result<ZScoreKeyRef<'_>> {
ZSetSubKeyCodec::decode_score_key(self.key)
}
}
impl RecordValueExt for RecordMut<'_> {
#[inline]
fn tag(&self) -> Option<KeyTag> {
key_tag(self.key())
}
#[inline]
fn bftag(&self) -> Option<BfTag> {
key_bftag(self.key())
}
#[inline]
fn meta_value(&self) -> Result<MetaValue> {
MetaValue::from_slice(self.value())
}
#[inline]
fn sub_key_ref(&self) -> Result<SubKeyRef<'_>> {
SubKeyRef::from_slice(self.key())
}
#[inline]
fn zmember_key_ref(&self) -> Result<ZMemberKeyRef<'_>> {
ZSetSubKeyCodec::decode_member_key(self.key())
}
#[inline]
fn zscore_key_ref(&self) -> Result<ZScoreKeyRef<'_>> {
ZSetSubKeyCodec::decode_score_key(self.key())
}
}
pub trait RecordValueMutExt {
fn update_meta_value(&mut self, meta: &MetaValue) -> Result<()>;
}
impl RecordValueMutExt for RecordMut<'_> {
#[inline]
fn update_meta_value(&mut self, meta: &MetaValue) -> Result<()> {
Ok(self.update_value_in_place(&meta.to_bytes())?)
}
}