Skip to main content

krabka_records_legacy/
set.rs

1//! v0/v1 `MessageSet`: a sequence of `(offset, size, message)` frames.
2//!
3//! The frames lie back-to-back. The set has no overall length prefix.
4//!
5//! ```text
6//! [ offset:i64 | size:i32 | <Message bytes for `size` bytes> ]*
7//! ```
8//!
9//! v0/v1 encodes compression as a *wrapper* message whose value is itself
10//! a compressed inner `MessageSet`. This module handles that layout.
11//! `encode_compressed_message_set` optionally wraps a flat `MessageSet` in
12//! a single compressed outer message. `decode_message_set` unwraps a
13//! single layer for the caller.
14
15use {bytes::Bytes, krabka_ids::Offset};
16
17mod decode;
18mod encode;
19
20#[cfg(test)]
21pub mod test_support;
22
23pub use self::{
24    decode::{decode_message_set, decode_message_set_with_policy},
25    encode::{encode_compressed_message_set, encode_flat_message_set},
26};
27
28/// A single decoded `MessageSet` entry.
29///
30/// The entry holds the offset-tagged payload of one logical record, after
31/// the codec unwraps compression.
32#[derive(Debug, Clone, PartialEq, Eq)]
33pub struct ParsedRecord {
34    pub offset: Offset,
35    /// Always `Some` when the source magic is v1. `None` when it is v0.
36    pub timestamp: Option<i64>,
37    pub key: Option<Bytes>,
38    pub value: Option<Bytes>,
39}