modelvault_core/segments/
writer.rs1use crate::checksum::crc32c;
7use crate::error::DbError;
8use crate::segments::header::SegmentHeader;
9use crate::storage::Store;
10
11pub struct SegmentWriter<'a, S: Store> {
13 store: &'a mut S,
14 offset: u64,
15}
16
17impl<'a, S: Store> SegmentWriter<'a, S> {
18 pub fn new(store: &'a mut S, offset: u64) -> Self {
20 Self { store, offset }
21 }
22
23 pub fn offset(&self) -> u64 {
25 self.offset
26 }
27
28 pub fn append(&mut self, header: SegmentHeader, payload: &[u8]) -> Result<u64, DbError> {
32 let header = SegmentHeader {
33 payload_len: payload.len() as u64,
34 payload_crc32c: crc32c(payload),
35 ..header
36 };
37 let encoded = header.encode();
38
39 let start = self.offset;
40 self.store.write_all_at(self.offset, &encoded)?;
41 self.offset += encoded.len() as u64;
42 self.store.write_all_at(self.offset, payload)?;
43 self.offset += payload.len() as u64;
44
45 Ok(start)
46 }
47}