use conduit_core::{
Decode, Encode, FRAME_HEADER_SIZE, FrameHeader, MsgType, PROTOCOL_VERSION, frame_pack,
frame_unpack,
};
use conduit_derive::{Decode, Encode};
#[derive(Debug, PartialEq, Encode, Decode)]
struct MarketTick {
timestamp: i64,
price: f64,
volume: f64,
side: u8,
}
#[derive(Debug, PartialEq, Encode, Decode)]
struct OrderBookLevel {
symbol: String,
bid: f64,
ask: f64,
bid_size: f64,
ask_size: f64,
depth: u32,
}
fn main() {
println!("=== conduit-derive usage ===\n");
println!("--- Step 2: Encode a MarketTick ---\n");
let tick = MarketTick {
timestamp: 1_700_000_000_000_000, price: 42_567.89,
volume: 1.2345,
side: 1, };
println!(" Original: {tick:?}");
let predicted_size = tick.encode_size();
println!(" Predicted wire size: {predicted_size} bytes");
println!(" i64 (timestamp) = 8 bytes");
println!(" f64 (price) = 8 bytes");
println!(" f64 (volume) = 8 bytes");
println!(" u8 (side) = 1 byte");
println!(" Total = 25 bytes");
assert_eq!(predicted_size, 25);
let mut buf = Vec::new();
tick.encode(&mut buf);
println!(" Encoded: {} bytes", buf.len());
println!(" Raw hex: {:02X?}", buf);
assert_eq!(buf.len(), predicted_size);
println!("\n--- Step 3: Decode and verify roundtrip ---\n");
let (decoded, consumed) = MarketTick::decode(&buf).unwrap();
println!(" Decoded: {decoded:?}");
println!(" Bytes consumed: {consumed}");
assert_eq!(decoded, tick);
assert_eq!(consumed, buf.len());
println!(" Roundtrip verified: original == decoded");
println!("\n--- Step 4: Embed in a conduit frame ---\n");
let header = FrameHeader {
version: PROTOCOL_VERSION,
reserved: 0,
msg_type: MsgType::Push,
sequence: 42,
payload_len: buf.len() as u32,
};
let frame = frame_pack(&header, &buf);
println!(
" Frame: {} bytes (header {} + payload {})",
frame.len(),
FRAME_HEADER_SIZE,
buf.len()
);
let (parsed_header, payload) = frame_unpack(&frame).expect("frame_unpack failed");
let (parsed_tick, _) = MarketTick::decode(payload).expect("decode failed");
assert_eq!(parsed_header.msg_type, MsgType::Push);
assert_eq!(parsed_header.sequence, 42);
assert_eq!(parsed_tick, tick);
println!(" Frame roundtrip verified!");
println!(" header.msg_type = {:?}", parsed_header.msg_type);
println!(" header.sequence = {}", parsed_header.sequence);
println!(" payload tick = {:?}", parsed_tick);
println!("\n--- Bonus: Variable-length struct ---\n");
let level = OrderBookLevel {
symbol: String::from("BTC/USD"),
bid: 42_500.00,
ask: 42_501.50,
bid_size: 3.5,
ask_size: 1.2,
depth: 0,
};
println!(" Original: {level:?}");
let size = level.encode_size();
println!(" Wire size: {size} bytes");
println!(" String \"BTC/USD\" = 4 (length prefix) + 7 (UTF-8) = 11 bytes");
println!(" f64 x4 = 32 bytes");
println!(" u32 (depth) = 4 bytes");
println!(" Total = 47 bytes");
assert_eq!(size, 47);
let mut level_buf = Vec::new();
level.encode(&mut level_buf);
let (decoded_level, consumed) = OrderBookLevel::decode(&level_buf).unwrap();
assert_eq!(decoded_level, level);
assert_eq!(consumed, level_buf.len());
println!(" Roundtrip verified: {} bytes consumed", consumed);
println!("\n--- Bonus: Back-to-back encoding ---\n");
let mut combined = Vec::new();
tick.encode(&mut combined);
level.encode(&mut combined);
println!(
" Combined buffer: {} bytes (tick {} + level {})",
combined.len(),
tick.encode_size(),
level.encode_size()
);
let (t, t_len) = MarketTick::decode(&combined).unwrap();
let (l, l_len) = OrderBookLevel::decode(&combined[t_len..]).unwrap();
assert_eq!(t, tick);
assert_eq!(l, level);
assert_eq!(t_len + l_len, combined.len());
println!(" Both decoded successfully, all bytes consumed.");
println!("\n=== Done! ===");
}