ergo-sbe 0.1.20

Simple Binary Encoding (SBE) — opinionated, idiomatic Rust code generation for low-latency trading protocols.
Documentation

ergo-sbe

Crates.io CI API Docs Book

ergo-sbe generates Rust SBE codecs with compile-time wire-order enforcement, closure-based groups, exact buffer sizing, and zero heap allocation on hot paths. Wire compatibility with official SBE is claimed for the shapes the dual-encode parity suite exercises — see the normative compatibility profile — not as an unqualified "implements every SBE edge case".

AI assistance. Large parts of this project were written with heavy AI assistance. Humans directed the work, approved designs, and ran verification. Details: AI-ASSISTANCE.md.

Full documentation

ergo-sbe book is the comprehensive guide for ergo-sbe (also linked from this crate on docs.rs):

  • Getting Started — depend, generate, encode, decode
  • Feature Tour — exact sizing, bulk arrays, decode stages, DTOs, trust boundaries
  • Core Concepts — wire order, buffer sizing, composites, flyweight vs struct
  • Configurationwith_conversion vs with_domain_type, hooks
  • Recipes — Display/Debug, schema→rustdoc, domain DTOs, timestamps
  • Benchmarks — parity methodology and gates

Compatibility profile (normative): docs/SBE_COMPATIBILITY.md — do not claim unqualified “SBE binary compatibility.”

Constructors: book Trust Boundary — three tiers: try_* (Result), bare names (panic if short), unsafe *_unchecked.

Placement utils: buffer positions (remaining / buffer / limit / message_offset) live on dec.get_metadata(), not the decoder type — migrate dec.remaining()dec.get_metadata().remaining(). A schema field named remaining keeps the natural accessor dec.remaining(). See book Generated code — metadata.

Quick Example

use ergo_sbe::{parse, Schema, Generator, GenerationConfig};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let xml = r#"<?xml version="1.0"?>
    <messageSchema package="demo" id="1" version="0" byteOrder="littleEndian">
      <types>
        <composite name="messageHeader">
          <type name="blockLength" primitiveType="uint16"/>
          <type name="templateId" primitiveType="uint16"/>
          <type name="schemaId" primitiveType="uint16"/>
          <type name="version" primitiveType="uint16"/>
        </composite>
      </types>
      <message name="Ping" id="1" blockLength="4">
        <field name="seq" id="1" type="uint32" offset="0"/>
      </message>
    </messageSchema>"#;

    let ir = parse(xml)?;
    let schema = Schema::from_ir(ir);
    let modules = Generator::new(GenerationConfig::new("demo_msgs"))
        .generate(&schema)?;
    // In a real project you'd use a build script.
    // Full guide: https://mimran1980.github.io/ergon/sbe/getting-started.html
    // Checked encode: MessageEncoder::try_wrap_and_apply_header(buf, 0)?
    // Trusted (panic if short): wrap_and_apply_header; unsafe: *_unchecked.
    let _ = modules;
    Ok(())
}

API Reference

docs.rs/ergo-sbe — generated Rustdoc for the published crate.

License

Apache-2.0.