conduyt 0.2.1

CONDUYT protocol SDK for Rust — host-side hardware control
Documentation
use conduyt::{wire_encode, wire_decode, make_packet};
use std::fs;
use std::path::PathBuf;

#[derive(serde::Deserialize)]
struct Vector {
    name: String,
    #[serde(rename = "type")]
    pkt_type: u8,
    seq: u8,
    payload_hex: String,
}

#[derive(serde::Deserialize)]
struct VectorFile {
    vectors: Vec<Vector>,
}

fn load_vectors() -> Vec<Vector> {
    let path: PathBuf = ["..","..","conformance","vectors","wire_vectors.json"].iter().collect();
    let data = fs::read_to_string(&path)
        .unwrap_or_else(|_| panic!("conformance vectors not found at {:?}", path));
    let vf: VectorFile = serde_json::from_str(&data).expect("parse vectors");
    vf.vectors
}

#[test]
fn conformance_wire_roundtrip() {
    let vectors = load_vectors();

    for v in &vectors {
        let payload = if v.payload_hex.is_empty() {
            vec![]
        } else {
            hex::decode(&v.payload_hex).expect("decode hex")
        };

        let pkt = make_packet(v.pkt_type, v.seq, &payload);
        let encoded = wire_encode(&pkt);
        let decoded = wire_decode(&encoded).unwrap_or_else(|e| {
            panic!("{}: decode failed: {}", v.name, e);
        });

        assert_eq!(decoded.pkt_type, v.pkt_type, "{}: type mismatch", v.name);
        assert_eq!(decoded.seq, v.seq, "{}: seq mismatch", v.name);
        assert_eq!(decoded.payload, payload, "{}: payload mismatch", v.name);
    }
}