krabka_records_legacy/lib.rs
1//! Apache Kafka legacy (v0/v1) `MessageSet` codec.
2//!
3//! This crate also bridges to and from the v2 `RecordBatch` types in
4//! [`krabka_protocol`].
5//!
6//! See the [Kafka protocol docs] for the wire layout that this crate
7//! implements. v0 carries no per-message timestamp. v1 adds one `i64`
8//! timestamp per message (KIP-32). Both versions signal compression in
9//! the low 3 bits of the per-message `attributes` byte. The compressed
10//! payload is a single outer message whose `value` is a nested,
11//! uncompressed `MessageSet`.
12//!
13//! [Kafka protocol docs]: https://kafka.apache.org/protocol.html#messageset
14//!
15//! ## Quick tour
16//!
17//! - [`Message`] / [`Magic`]: per-message wire format, with a CRC and the
18//! message fields.
19//! - [`ParsedRecord`][]: cross-format view of a single offset-tagged
20//! record.
21//! - [`decode_message_set`] / [`encode_flat_message_set`] /
22//! [`encode_compressed_message_set`]: top-level codec.
23//! - [`v2_to_legacy`] / [`legacy_to_v2`]: bridge to and from
24//! `krabka_protocol::records::RecordBatch`. Use these from the Fetch
25//! handler for down-conversion, and from the Produce handler for
26//! up-conversion.
27//!
28//! ## Encode and decode a v1 `MessageSet`
29//!
30//! ```rust
31//! use {
32//! bytes::{Bytes, BytesMut},
33//! krabka_ids::Offset,
34//! krabka_records_legacy::{Magic, ParsedRecord, decode_message_set, encode_flat_message_set},
35//! };
36//!
37//! # fn run() -> Result<(), Box<dyn std::error::Error>> {
38//! let records = vec![ParsedRecord {
39//! offset: Offset(42),
40//! timestamp: Some(1_713_000_000_000),
41//! key: Some(Bytes::from_static(b"order-42")),
42//! value: Some(Bytes::from_static(b"created")),
43//! }];
44//!
45//! let mut buf = BytesMut::new();
46//! encode_flat_message_set(records, Magic::V1, &mut buf);
47//! let decoded = decode_message_set(&mut &buf[..], buf.len())?;
48//! assert2::assert!((decoded[0].offset) == (Offset(42)));
49//! # Ok(())
50//! # }
51//! ```
52
53mod bridge;
54mod error;
55mod message;
56mod set;
57
58pub use {
59 bridge::{legacy_to_v2, legacy_to_v2_with_policy, parsed_from_v2, v2_to_legacy},
60 error::LegacyRecordsError,
61 message::{Magic, Message, attrs, attrs_with_compression, compression_from_attrs},
62 set::{
63 ParsedRecord, decode_message_set, decode_message_set_with_policy,
64 encode_compressed_message_set, encode_flat_message_set,
65 },
66};