Module record

Module record 

Source
Expand description

Record and field structures for LNMP data.

§Field Ordering

LnmpRecord stores fields internally in a Vec, maintaining insertion order. However, for deterministic behavior and canonical representation, use sorted_fields():

use lnmp_core::{LnmpRecord, LnmpField, LnmpValue};

let mut record = LnmpRecord::new();
record.add_field(LnmpField { fid: 23, value: LnmpValue::Int(3) });
record.add_field(LnmpField { fid: 7, value: LnmpValue::Int(1) });
record.add_field(LnmpField { fid: 12, value: LnmpValue::Int(2) });

// Insertion order (non-deterministic across different constructions)
assert_eq!(record.fields()[0].fid, 23);
assert_eq!(record.fields()[1].fid, 7);
assert_eq!(record.fields()[2].fid, 12);

// Canonical order (deterministic, sorted by FID)
let sorted = record.sorted_fields();
assert_eq!(sorted[0].fid, 7);
assert_eq!(sorted[1].fid, 12);
assert_eq!(sorted[2].fid, 23);

§When to Use Each

  • fields(): When insertion order is semantically important

    • Direct iteration over fields as added
    • Structural equality (order-sensitive)
  • sorted_fields(): For canonical representation

    • Encoding (text/binary)
    • Checksum computation
    • Semantic comparison (order-independent)
    • Deterministic output

§Deterministic Guarantees

The following components always use sorted_fields() for determinism:

  • SemanticChecksum::serialize_value() - Field-order-independent checksums
  • All encoders in lnmp-codec - Canonical output
  • Binary format - Sorted fields for stable round-trips

This ensures that two records with the same fields but different insertion orders will produce identical checksums and encodings.

Structs§

FieldOrderingError
Error returned when field ordering validation fails
LnmpField
A single field assignment (field ID + value pair)
LnmpRecord
A complete LNMP record (collection of fields)