Skip to main content

nodedb_cluster/metadata_group/
codec.rs

1// SPDX-License-Identifier: BUSL-1.1
2
3//! Serialize / deserialize helpers for [`MetadataEntry`].
4//!
5//! Entries are wrapped in a [`crate::wire_version::Versioned`] envelope so
6//! future variant additions can be detected and rejected cleanly on older
7//! nodes rather than silently misinterpreted.
8
9use crate::error::ClusterError;
10use crate::metadata_group::entry::MetadataEntry;
11use crate::wire_version::{decode_versioned, encode_versioned};
12
13/// Encode a [`MetadataEntry`] into a v2 versioned wire envelope.
14pub fn encode_entry(entry: &MetadataEntry) -> Result<Vec<u8>, ClusterError> {
15    encode_versioned(entry).map_err(|e| ClusterError::Codec {
16        detail: format!("metadata encode: {e}"),
17    })
18}
19
20/// Decode a [`MetadataEntry`] from bytes.
21///
22/// Requires a v2 versioned envelope. Rejects bytes without the envelope
23/// marker and envelopes with unsupported future version numbers.
24pub fn decode_entry(data: &[u8]) -> Result<MetadataEntry, ClusterError> {
25    decode_versioned(data).map_err(|e| ClusterError::Codec {
26        detail: format!("metadata decode: {e}"),
27    })
28}
29
30#[cfg(test)]
31mod tests {
32    use super::*;
33    use crate::metadata_group::entry::{MetadataEntry, TopologyChange};
34
35    #[test]
36    fn metadata_entry_versioned_roundtrip() {
37        let entry = MetadataEntry::TopologyChange(TopologyChange::Join {
38            node_id: 42,
39            addr: "127.0.0.1:7001".to_string(),
40        });
41        let bytes = encode_entry(&entry).unwrap();
42        let decoded = decode_entry(&bytes).unwrap();
43        assert_eq!(entry, decoded);
44    }
45}