use std::ops::Deref;
use wram::AlignedBuf;
use wrecord::{RecordHeader, RecordRef};
use crate::error::Result;
#[derive(Debug)]
pub enum RecordOutput {
Memory(Vec<u8>),
Disk(AlignedBuf),
}
impl Deref for RecordOutput {
type Target = [u8];
#[inline]
fn deref(&self) -> &Self::Target {
self.as_slice()
}
}
impl AsRef<[u8]> for RecordOutput {
#[inline]
fn as_ref(&self) -> &[u8] {
self.as_slice()
}
}
impl RecordOutput {
#[inline]
pub fn as_slice(&self) -> &[u8] {
match self {
Self::Memory(v) => v.as_slice(),
Self::Disk(b) => b.as_slice(),
}
}
#[inline]
pub fn len(&self) -> usize {
self.as_slice().len()
}
#[inline]
pub fn is_empty(&self) -> bool {
self.as_slice().is_empty()
}
#[inline]
pub fn as_record_ref(&self) -> Result<RecordRef<'_>> {
RecordRef::from_slice(self.as_slice()).map_err(Into::into)
}
#[inline]
pub fn header(&self) -> Result<RecordHeader> {
self.as_record_ref().map(|r| *r.header())
}
#[inline]
pub fn key(&self) -> Result<&[u8]> {
self.as_record_ref().map(|r| r.key())
}
#[inline]
pub fn value(&self) -> Result<&[u8]> {
self.as_record_ref().map(|r| r.value())
}
#[inline]
pub fn prev_address(&self) -> Result<u64> {
self.as_record_ref().map(|r| r.prev_address())
}
#[inline]
pub fn is_tombstone(&self) -> Result<bool> {
self.as_record_ref().map(|r| r.is_tombstone())
}
#[inline]
pub fn total_size(&self) -> Result<usize> {
self.as_record_ref().map(|r| r.total_size())
}
pub fn into_owned_kv(self) -> Result<(Vec<u8>, Vec<u8>)> {
let r = self.as_record_ref()?;
Ok((r.key().to_vec(), r.value().to_vec()))
}
}