bp3d-tracing 1.0.0-alpha-2.0.0

Tracing subscriber implementations for use with BP3D software. Supports traditional logging through bp3d-logger and supports remote profiling through TCP.
Documentation
use std::fs::File;
use std::io::BufWriter;
use std::path::PathBuf;
use semver::Version;
use std::io::Write;

const WRITE_FAIL: &str = "Failed to write verision_inject file";

fn main() {
    let path = std::env::var_os("OUT_DIR")
        .map(PathBuf::from)
        .expect("Couldn't obtain cargo OUT_DIR")
        .join("version_inject.rs");
    let file = File::create(path).expect("Couldn't create version_inject file");
    let mut writer = BufWriter::new(file);
    let version = std::env::var("CARGO_PKG_VERSION")
        .expect("Unable to read package version");
    let version = Version::parse(&version).expect("Failed to parse package version");
    if !version.pre.is_empty() {
        write!(&mut writer, "const VERSION_DATA: [u8; 24] = [").expect(WRITE_FAIL);
        let len = std::cmp::min(24, version.pre.as_bytes().len());
        for v in 0..len {
            write!(&mut writer, "0x{:X}, ", version.pre.as_bytes()[v]).expect(WRITE_FAIL);
        }
        for _ in 0..24 - len {
            write!(&mut writer, "0x0, ").expect(WRITE_FAIL);
        }
        writeln!(&mut writer, "];").expect(WRITE_FAIL);
        writeln!(&mut writer, "pub const HELLO_PACKET: Hello = Hello::new({}, Some(VERSION_DATA));", version.major)
            .expect(WRITE_FAIL);
    } else {
        writeln!(&mut writer, "pub const HELLO_PACKET: Hello = Hello::new({}, None);", version.major)
            .expect(WRITE_FAIL);
    }
}