hid-decode 0.3.1

HID report descriptor decoding utilities
Documentation
use std::io::stdout;
use std::path::PathBuf;
use std::process::ExitCode;

use clap::Parser;
use hid_decode::TextDecoder;

#[derive(Debug, Clone, Parser)]
struct Arguments {
    /// A file containing a binary HID descriptor.
    descriptor_filename: PathBuf,
    /// Display the hex bytes corresponding to each item.
    #[arg(long)]
    show_bytes: bool,
    /// Display the tag type for each item.
    #[arg(long)]
    show_tag_types: bool,
    /// Reject zero-length item values.
    #[arg(long)]
    reject_zero_length_values: bool,
}

fn main() -> ExitCode {
    let args = Arguments::parse();

    let descriptor_bytes = match std::fs::read(&args.descriptor_filename) {
        Ok(bytes) => bytes,
        Err(e) => {
            eprintln!("failed to read {}: {e}", args.descriptor_filename.display());
            return ExitCode::FAILURE;
        }
    };

    let mut decoder = TextDecoder::new(stdout());

    if args.show_bytes {
        decoder = decoder.display_raw_bytes();
    }
    if args.show_tag_types {
        decoder = decoder.display_tag_type();
    }
    if args.reject_zero_length_values {
        decoder = decoder.reject_zero_length_values();
    }

    match decoder.decode(&descriptor_bytes) {
        Ok(()) => ExitCode::SUCCESS,
        Err(e) => {
            eprintln!("error writing decoded descriptor: {e}");
            ExitCode::FAILURE
        }
    }
}