use super::*;
use crate::background::CheckpointBytes;
pub(super) struct CheckpointEncoder<'a> {
bytes: CheckpointBytes,
work: &'a CheckpointWorkContext,
}
impl<'a> CheckpointEncoder<'a> {
pub(super) fn new(work: &'a CheckpointWorkContext) -> Result<Self, AppendTableError> {
Ok(Self {
bytes: CheckpointBytes::new(0, work).map_err(work_error)?,
work,
})
}
pub(super) fn len(&self) -> usize {
self.bytes.len()
}
pub(super) fn u32(&mut self, value: u32) -> Result<(), AppendTableError> {
self.raw(&value.to_le_bytes())
}
pub(super) fn u64(&mut self, value: u64) -> Result<(), AppendTableError> {
self.raw(&value.to_le_bytes())
}
pub(super) fn raw(&mut self, value: &[u8]) -> Result<(), AppendTableError> {
self.bytes
.append_growing(value, None, self.work)
.map_err(work_error)
}
pub(super) fn overwrite_u32(&mut self, offset: usize, value: u32) {
self.bytes.as_mut_slice()[offset..offset + 4].copy_from_slice(&value.to_le_bytes());
}
pub(super) fn finish(self) -> CheckpointBytes {
self.bytes
}
}