Protogen is a protocol description language for generating safe and efficient parsers and (eventually) generators for data protocols.
Currently both the language and (Rust) reference implementations are very alpha, and likely to change significantly.
See hci-rs for a large-scale protocol implemented in protogen.
A simple .wav parser looks like this: ```protogen wave = { chunkid: [u8; 4] | [b"RIFF"]; @chunksize: u32; public format: [u8; 4] | [b"WAVE"]; @datasize: u32 = @chunksize - 8; @data: [u8; @data_size]; public chunks: apply @data many!(subchunk()); }
subchunk = { @id: [u8; 4]; @size: u32; @data: [u8; @size]; public subchunk: apply @data choose { FormatSubchunk = fmtsubchunk(@id) | DataSubchunk = datasubchunk(@id) | OtherSubchunk = other_subchunk(@id) }; }
fmtsubchunk ($id: [u8; 4] = b"fmt ") = { public audioformat: u16; public numchannels: u16; public samplerate: u32; public byterate: u32; public blockalign: u16; public bitspersample: u16; }
data_subchunk ($id: [u8; 4] = b"data") = { public data: rest!(); }
other_subchunk (public $id: [u8; 4]) = { public data: rest!(); } ```
And can be used in a rust program as:
```rust use wave::*; use std::path::Path; use std::fs::File; use std::io::Read; use std::str; use std::env;
fn main() {
let args: Vec
let mut file = File::open(&path).unwrap();
let mut buf: Vec<u8> = vec![];
file.read_to_end(&mut buf).unwrap();
for chunk in parsed.get_chunks() {
println!("Chunk: {:?}", chunk);
}
} ```