Multi-Template Dispatch
AnyMessage reads the generated header layout and dispatches on the template
ID. Prefer AnyMessage::try_decode at untrusted boundaries (returns
Result). Bare AnyMessage::decode is the same implementation today; keep
using try_* naming for consistency with the three-tier trust boundary.
#![allow(unused)]
fn main() {
pub fn demo_any_message() -> Result<(), Box<dyn std::error::Error>> {
let mut hb = [0u8; HeartbeatEncoder::compute_length_with_header()];
let hb_len = HeartbeatEncoder::compute_length_with_header();
let nanos: u64 = 1_700_000_000_000_000_000;
let _hb_len = HeartbeatEncoder::try_wrap_and_apply_header(&mut hb, 0)
.unwrap()
.fixed(&HeartbeatFixedFields {
sequence: 1,
timestamp: nanos,
})
.encoded_length_with_header();
let note_body = "hello AnyMessage";
let note_len = NoteEncoder::compute_length_with_header(note_body.len());
const NOTE_PAD: usize = 64;
assert!(note_len <= NOTE_PAD);
let mut note_storage = [0u8; NOTE_PAD];
let note = &mut note_storage[..note_len];
let note_written = NoteEncoder::try_wrap_and_apply_header(note, 0)?
.fixed(&NoteFixedFields { note_id: 99 })
.body_as_str(note_body)?
.encoded_length_with_header();
assert_eq!(note_written, note_len);
// Concatenate framed messages (each includes its own SBE header).
let mut stream = Vec::new();
stream.extend_from_slice(&hb[..hb_len]);
stream.extend_from_slice(¬e[..note_written]);
let mut offset = 0usize;
let mut saw_heartbeat = false;
let mut saw_note = false;
while offset < stream.len() {
match AnyMessage::try_decode(&stream, offset)? {
AnyMessage::Heartbeat(d) => {
assert_eq!(d.sequence(), 1);
offset += d.encoded_length_with_header()?;
saw_heartbeat = true;
}
AnyMessage::Note(d) => {
assert_eq!(d.note_id(), 99);
let (body, complete) = d.into_body_as_str()?;
assert_eq!(body, note_body);
offset += complete.encoded_length() + NoteDecoder::HEADER_LENGTH;
saw_note = true;
}
AnyMessage::Car(_) => return Err("unexpected Car in this demo stream".into()),
AnyMessage::Quote(_) => return Err("unexpected Quote in this demo stream".into()),
AnyMessage::Unknown { .. } => {
return Err("unexpected Unknown template".into());
}
}
}
assert!(saw_heartbeat && saw_note);
Ok(())
}
}
(This code comes from the sbe-feature-tour sample crate.)