xbf_rs 0.1.0

The reference implementation for the XBF format.
Documentation
use anyhow::Result;
use byteorder::WriteBytesExt;
use std::{io::Read, net::TcpStream, time::Instant};

#[repr(u8)]
#[derive(Debug)]
enum DataFormat {
    Csv,
    MessagePack,
    Cbor,
    Json,
    Xml,
    Xbf,
    XbfDataOnly,
    Unknown,
}

impl From<u8> for DataFormat {
    fn from(value: u8) -> Self {
        match value {
            0 => Self::Csv,
            1 => Self::MessagePack,
            2 => Self::Cbor,
            3 => Self::Json,
            4 => Self::Xml,
            5 => Self::Xbf,
            6 => Self::XbfDataOnly,
            _ => Self::Unknown,
        }
    }
}

impl From<DataFormat> for u8 {
    fn from(value: DataFormat) -> Self {
        value as u8
    }
}

fn main() -> Result<()> {
    let addr = format!(
        "{}:42069",
        std::env::args().nth(1).unwrap_or("127.0.0.1".to_string())
    );

    for data_format in 0..DataFormat::Unknown.into() {
        let mut durations = vec![];
        let mut bytes_read = None;

        for _ in 0..100 {
            let time_start = Instant::now();

            let mut connection = TcpStream::connect(&addr)?;
            connection.write_u8(data_format)?;

            let mut buf = vec![];
            let bytes = connection.read_to_end(&mut buf)?;

            let time_elapsed = Instant::now() - time_start;

            if bytes_read.is_none() {
                bytes_read = Some(bytes);
            }

            durations.push(time_elapsed);
        }

        let avg_time = durations.iter().sum::<std::time::Duration>() / durations.len() as u32;

        println!(
            "Data Format: {:?}\nAvg Time: {:?}\nBytes Read: {:?}\n",
            DataFormat::from(data_format),
            avg_time,
            bytes_read
        );
    }

    Ok(())
}