use clap::Parser;
use std::{
fs::*,
io::{self, *},
};
#[derive(Parser)]
struct Cli {
#[arg(default_value_t = 1)]
val: u8,
#[arg(default_value_t = String::new(), short, long)]
r#if: String,
#[arg(default_value_t = String::new(), short, long)]
of: String,
#[arg(default_value_t = false, short, long)]
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
}
}