devone 0.1.1

In addition to /dev/zero, aka, a UNIX virtual device, it can simulate /dev/one.
use clap::Parser;
use std::{
    fs::*,
    io::{self, *},
};
#[derive(Parser)]
struct Cli {
    #[arg(default_value_t = 1)]
    ///specify 0 or 1 to output
    val: u8,
    #[arg(default_value_t = String::new(), short, long)]
    ///input file
    r#if: String,
    #[arg(default_value_t = String::new(), short, long)]
    ///output file
    of: String,
    #[arg(default_value_t = false, short, long)]
    ///append instead of overwrite
    append: bool,
}
fn main() -> io::Result<()> {
    let args = Cli::parse();
    let val: [u8; 1] = if args.val == 0 {
        [0b0000_0000]
    } else if args.val == 1 {
        [0b1111_1111]
    } else {
        [args.val]
    };

    let w: Box<dyn Fn(&[u8]) -> io::Result<()>> = if args.of == String::new() {
        Box::new(|v| {
            let mut a = Ok(());
            if let Err(e) = io::stdout().write_all(v) {
                a = Err(e)
            }
            a
        })
    } else {
        Box::new(|v| {
            let mut f = OpenOptions::new()
                .create(true)
                .write(true)
                .append(args.append)
                .open(&args.of)?;
            let mut a = Ok(());
            if let Err(e) = f.write_all(v) {
                a = Err(e)
            }
            a
        })
    };

    if args.r#if == String::new() {
        let mut a = Ok(());
        loop {
            if let Err(e) = w(&val) {
                a = Err(e);
                break;
            }
        }
        a
    } else {
        let mut a = Ok(());
        loop {
            let f = File::open(&args.r#if).unwrap();
            let b = BufReader::new(f);
            for l in b.lines() {
                if let Err(e) = w((l.unwrap() + "\n").as_bytes()) {
                    a = Err(e);
                    break;
                }
            }
            if let Err(_) = a {
                break;
            }
        }
        a
    }
}