command-stream 1.1.1

Modern shell command execution library with streaming, async iteration, and event support
Documentation
use std::env;
use std::fs;
use std::io::{self, Read, Write};
use std::process;
use std::thread;
use std::time::Duration;

fn hex(bytes: &[u8]) -> String {
    bytes.iter().map(|byte| format!("{byte:02x}")).collect()
}

fn main() {
    let mut args = env::args().skip(1);
    let mode = args.next().expect("fixture mode");
    match mode.as_str() {
        "argv" => {
            for value in args {
                println!("{}", hex(value.as_bytes()));
            }
        }
        "cwd" => print!("{}", env::current_dir().unwrap().display()),
        "env" => {
            for key in args {
                println!("{}", hex(env::var(&key).unwrap_or_default().as_bytes()));
            }
        }
        "output" => {
            let stdout = args.next().unwrap_or_default();
            let stderr = args.next().unwrap_or_default();
            io::stdout().write_all(stdout.as_bytes()).unwrap();
            io::stderr().write_all(stderr.as_bytes()).unwrap();
        }
        "large" => {
            let size: usize = args.next().unwrap().parse().unwrap();
            io::stdout().write_all(&vec![b'x'; size]).unwrap();
        }
        "stdin" => {
            let mut input = Vec::new();
            io::stdin().read_to_end(&mut input).unwrap();
            print!("{}", hex(&input));
        }
        "exit" => process::exit(args.next().unwrap().parse().unwrap()),
        "delayed" => {
            let first = args.next().unwrap();
            let delay_ms: u64 = args.next().unwrap().parse().unwrap();
            let second = args.next().unwrap();
            print!("{first}");
            io::stdout().flush().unwrap();
            thread::sleep(Duration::from_millis(delay_ms));
            print!("{second}");
        }
        "touch" => fs::write(args.next().unwrap(), b"spawned").unwrap(),
        "prefix" => {
            let prefix = args.next().unwrap();
            let mut input = String::new();
            io::stdin().read_to_string(&mut input).unwrap();
            print!("{prefix}{input}");
        }
        other => panic!("unknown fixture mode: {other}"),
    }
}