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 {
descriptor_filename: PathBuf,
#[arg(long)]
show_bytes: bool,
#[arg(long)]
show_tag_types: bool,
#[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
}
}
}