use rustyasn::{Config, DecoderStreaming, Encoder, EncodingRule};
use rustyfix_dictionary::Dictionary;
use std::sync::Arc;
fn main() -> Result<(), Box<dyn std::error::Error>> {
streaming_example()
}
fn streaming_example() -> Result<(), Box<dyn std::error::Error>> {
let dict = Arc::new(Dictionary::fix44()?);
let config = Config::new(EncodingRule::DER);
let encoder = Encoder::new(config.clone(), dict.clone());
let mut test_messages = Vec::new();
println!("Creating test messages...");
for seq_num in 1..=3 {
let mut handle = encoder.start_message("0", "SENDER", "TARGET", seq_num);
handle.add_string(112, format!("TestID_{seq_num}")); let encoded = handle.encode()?;
test_messages.extend_from_slice(&encoded);
println!(" Message {}: {} bytes", seq_num, encoded.len());
}
println!("\nTotal test data size: {} bytes", test_messages.len());
let mut decoder = DecoderStreaming::new(config, dict);
let mut messages_decoded = 0;
let chunk_size = std::cmp::max(1, test_messages.len() / 3); println!("\nProcessing data in chunks of {chunk_size} bytes...");
for (chunk_idx, chunk) in test_messages.chunks(chunk_size).enumerate() {
println!(
" Processing chunk {}: {} bytes",
chunk_idx + 1,
chunk.len()
);
decoder.feed(chunk);
while let Ok(Some(message)) = decoder.decode_next() {
messages_decoded += 1;
println!(
" Decoded message: {} from {} (seq: {})",
message.msg_type(),
message.sender_comp_id(),
message.msg_seq_num()
);
if let Some(test_req_id) = message.get_string(112) {
println!(" TestReqID: {test_req_id}");
}
}
}
println!("\n✓ Streaming decoding complete!");
println!("Total messages decoded: {messages_decoded}");
Ok(())
}