Rustで入力されたものを処理するプログラム(16進出力プログラム)

今回は、Rustで標準入力、引数処理の勉強として作成したプログラムを公開します。

エラー処理など甘い箇所がありますが、勉強の一環としての作成なのでご容赦ください

//! 入力された数値を16進表記にして1行に1つずつ出力するプログラム
//!
//! # Note
//! + 入力は以下に対応している
//!   + コマンドライン引数が1個以上: 全てに対して処理を行う
//!   + コマンドライン引数が0個: 標準入力での入力
//!     + 標準入力では、半角スペースで区切っていれば1行に複数個書くことが可能
//!   + 対応している数は0-255の数値
//!
//! # Examples
//! >>> EXE 11 231
//! 0x0B
//! 0xB7
//!
//! >>> EXE
//! >>> 11 31 23
//! >>> 212
//! >>> 33 13
//! 0x0B
//! 0x1F
//! 0x17
//! 0xD4
//! 0x21
//! 0x0D
//!
//! # References
//! + https://qiita.com/wotsushi/items/4a6797f52080453a0440

use std::io::Read;

fn main() {
    let args: Vec<String> = std::env::args().collect();
    // 引数の数が1個(自身のパス)以下の場合は標準入力にする
    if args.len() < 2 {
        let mut buf = String::new();
        let stdin = std::io::stdin();
        let mut handle = stdin.lock();
        handle.read_to_string(&mut buf).unwrap();
        for line in buf.lines() {
            let list: Vec<&str> = line.split_whitespace().collect();
            for elem in list {
                display_hex(elem);
            }
        }
    }
    for (i, arg) in args.iter().enumerate() {
        // 0番目は自身のパスなのでそれより後に格納されているものだけを処理する
        if i > 0 {
            display_hex(arg);
        }
    }
}

/// 引数をu8に変換した後に16進表記で出力する
fn display_hex(text: &str) {
    let num: u8 = text.trim().parse().ok().unwrap();
    println!("0x{:0>2X}", num);
}