Feature Matrix

Scannable map of capabilities. Use the More links for samples and tests.

FeatureWhat it doesHow to use / more
build.rs codegenCompile-time schema → Rust module in OUT_DIRgenerate_to_out_dir("schemas/….xml", config)? · plain include! or sbe_mod!(name) · Quick start · codegen examples
Wire compatibilitySame on-wire layout as official SBEDual encode ergo vs sbe-tool · sbe_tool_wire_parity_test · golden fixtures · Benchmarks · baseline_test
Flyweight decodeZero-copy over &[u8]CarDecoder::try_from(buf)?; car.serial_number() · feature-tour
Composite wire image#[repr(transparent)] Engine([u8; N]) + LE accessors; flyweight defaultNot a repr(C) overlay · Core ideas · composite_layout_test
Per-field vs whole structFlyweight or *FixedFields / *DomainSingle field: flyweight · always fill fixed block: .fixed(&CarFixedFields { … }) · whole message owned: CarDomain · Core ideas · feature-tour
Stage-struct encode + closuresWire order as named monomorphic stages; groups via nested closuresbids(n, |g| g.add(|e| …))? · wrong order = missing method · Core ideas · Recipes · Benchmarks
Consuming decode stagesDistinct after-stage decoder typesinto_bids()? → next named stage · ordered_decoder_stages_test · l3_consuming_stages_test
Three-tier constructors (0.1.12+)try_*Result; bare wrap/decode panic if short; unsafe *_uncheckedCarDecoder::try_decode(buf, 0)? · CarDecoder::verify(buf)? · demo_try_vs_trusted · Trust boundary
Placement metadataBuffer utils on get_metadata() so field names remaining / buffer / limit / message_offset stay natural (no _field rename)dec.get_metadata().remaining() · schema field remainingdec.remaining() · Generated code · reserved_name_clash_test
Exact buffer sizingSchema-aware length for nested/ragged msgs — no hand-calculated sizescompute_length_with_header() (fixed) · compute_length_with_header(…) (flat) · *EncodedLength (nested) · Core ideas · l3-book · encoded_length_api_test
Schema docs → rustdocXML descriptions become item docsdescription="…" / <description> / <comment> / <!-- --> · schema_docs_provenance_test
Display / DebugDiagnostic print (not wire format)println!("{car}"); · Display / Debug · demo_display_debug
NULL / MIN / MAXSchema sentinels as constsMODEL_YEAR_NULL · baseline_test
Version-aware fieldssinceVersion / acting versionOption or skip on older wire · baseline_test · multi_schema_versioning_test
Groups / nested groupsRepeating dimensionsbids(n, |g| g.add(…))? · l3-book · l3_orderbook_test
Bulk group encode / decodebulk_add(&[Entry]) / bulk_add_domain(&[EntryDomain]) / bulk_decode() -> Vec<Entry> for eligible flat groupsWire bulk_add: about 22-23% lower encode latency than per-entry add() for the audited 1,000-entry cases. DTO re-encode selects the domain bulk path automatically when wire and domain fields match; remeasure for your schema · group_encode_bench
Var-data / textLength-prefix; optional UTF-8/ASCIImanufacturer(b"Honda")? · *_as_str when encoding set · feature-tour
Fixed arrays + bulk helpersArrays, put, pad string, copy-output_some_numbers(…) · vehicle_code_str · copy_vehicle_code · java_parity_features_test
Enums / sets / boolWire enums, bitsets, _boolavailable() / available_bool(true) · comprehensive_test
with_conversionWire type → any app type you implprice_from(&Cents)? / price_as::<Cents>()? · Configuration · exchange-example
with_domain_typeWire type → one fixed Rust pathenc.try_price(d)?; let d = dec.try_price()? · l3-book · Configuration
Domain DTOsOwned structs + re-encode; allocation-free automatic bulk write for eligible flat groups; var-data via [DomainVarData].with_domain_objects(DomainVarData::Strings) · Domain DTOs · domain_objects_test
AnyMessage + framesMulti-template + framed streamsAnyMessage::try_decode (bare decode is the same path today) · FrameCursor · demo_any_message
verifyFull tail bounds check (associated)CarDecoder::verify(buf)? · demo_try_vs_trusted
Schema identityId / version / hashesSCHEMA_ID, SCHEMA_HASH, SCHEMA_SHA256_HEX · generated module header
Multi-schema shared typesDedup across packages.with_shared_module + generate_multi · exchange-example · multi_schema_versioning_test
Keyword-safe namestypetype_.with_keyword_append_token("_") · java_parity_features_test
XSD-shaped validationOpt-in stricter check for schema authorsvalidate_against_sbe_xsd / parse_with_xsd_validation · xsd.rs
Zero-alloc hot pathFlyweights + caller buffersallocation_count_test · Benchmarks
Property round-tripRandom messages encode→decodecargo test -p ergo-sbe --test proptest_roundtrip · proptest_roundtrip
NullVal → Option<T>Enum/boolean NullVal mapped to Option; wire-identical.with_null_as_option(ConversionSelector::named_type("EventCode")) or .with_all_enums_as_option()dec.code() -> Option<EventCode> · NullVal design note
Domain var-data typesCompactString (≤24B inline), SmolStr (O(1) clone), bytes::Bytes (shared).with_domain_objects(DomainVarData::CompactStrings) — feature-gated: compact_str, smol_str, bytes · Feature integrations
Codec-level type accessorsinto_<field>_as_compact_str() / _as_smol_str() / _as_bytes() on consuming stagesFeature-gated behind compact_str, smol_str, bytes · Feature integrations
Chrono timestampsDateTime<Utc> / NaiveDateTime from wire i64.with_domain_type(ConversionSelector::semantic_type("UTCTimestamp"), "chrono::DateTime<chrono::Utc>") — feature-gated: chrono · Timestamps
Lean constructorGenerationConfig::lean("minimal") — no Display/Debug/dispatch, explicit settings preservedlean() shorthand for new().profile(Lean) · GenerationConfig
Must-use lifecycle#[must_use] on SessionBuilder, AsyncClusterConnect, ClusterClaimCompile-time guard against discarded builder/connect/claim · SessionBuilder
PayloadTooLargeTyped error when header+payload exceeds Aeron maxClusterError::PayloadTooLarge { operation, requested, maximum } · Cluster client
Zero-alloc offer_partsFragmented path uses offer_parts gather — no heap, no payload copyStack header + borrowed payload · Cluster client
checked_deadlineFallible deadline: rejects zero/overflowClusterError::InvalidTimeout · Cluster client