use rustbinary::{Config, Model, RansDecoder, RansEncoder, Reflect, SchemaModel};
#[derive(Debug, Reflect)]
#[allow(dead_code)]
struct Telemetry {
kind: TelemetryKind,
#[entropy(symbols = 10)]
priority: u8,
level: bool,
payload: u8,
}
#[derive(Debug, Reflect)]
#[allow(dead_code)]
enum TelemetryKind {
Temperature,
Pressure,
Humidity,
Wind,
Gust,
}
fn main() -> rustbinary::Result<()> {
let config = rustbinary::options()
.with_limit(1 << 16)
.with_entropy_encoding();
let schema = SchemaModel::from_reflect::<Telemetry>();
for field in schema.fields() {
println!("field {:>8}: {} symbols", field.name, field.model.symbols());
}
let field_models = schema.models();
let models: Vec<&Model> = [field_models.as_slice(), field_models.as_slice()]
.concat()
.into_iter()
.collect();
let symbols = [2u32, 7, 1, 200, 0, 3, 0, 0]; let frame = config.encode_sequence(&models, &symbols)?;
let decoded = config.decode_sequence(&models, &frame)?;
assert_eq!(decoded, symbols);
println!("sequence frame: {} bytes for 8 schema symbols", frame.len());
let weights: Vec<u32> = {
let mut weights = vec![1u32; 256];
weights[b'0' as usize] = 1000;
weights[b'1' as usize] = 500;
weights
};
let model = Model::from_weights(&weights)?;
let samples = vec![b'0'; 1024];
let compressed = config.compress(&samples, &model)?;
let restored = config.decompress(&compressed, &model)?;
assert_eq!(restored, samples);
println!(
"byte frame: {} bytes for {} samples (raw would be {})",
compressed.len(),
samples.len(),
samples.len()
);
let kind_model = Model::from_uniform(5)?;
let mut encoder = RansEncoder::new();
for _ in 0..100 {
encoder.put_symbol(&kind_model, 3)?; }
let (final_state, payload) = encoder.finish();
let mut decoder = RansDecoder::new(final_state, &payload);
let mut restored_kinds = Vec::new();
for _ in 0..100 {
restored_kinds.push(decoder.get_symbol(&kind_model)?);
}
decoder.finish()?;
restored_kinds.reverse();
assert!(restored_kinds.iter().all(|&kind| kind == 3));
println!(
"100 enum symbols (5 variants) coded in {} bytes",
payload.len()
);
Ok(())
}
#[allow(dead_code)]
fn _uses(_: Config) {}