From a9427bf6d7ce65653be77e7a7dc534ac795d9214 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Ortega=20Froysa?= Date: Mon, 29 Sep 2025 10:01:29 +0200 Subject: [PATCH] Add command-line arguments. --- src/main.rs | 110 +++++++++++++++++++++----------------------------- src/worker.rs | 77 +++++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+), 64 deletions(-) create mode 100644 src/worker.rs diff --git a/src/main.rs b/src/main.rs index 61a3ba2..e70af1a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,83 +23,65 @@ */ use std::env; -use std::fs; use std::io; -use std::io::Read; -use std::boxed::Box; use std::process; -// Read 1KiB of the file at a time. -static BLOCK_SIZE:usize = 1024; +use crate::worker::work; + +mod worker; + +fn print_version() { + println!("{} v{}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION")); +} + +fn print_usage() { + println!("Usage: {} [out-file]", env!("CARGO_PKG_NAME")); +} + +fn print_help() { + print_version(); + println!("Usage: \n\ + \t{} [out-file]\n\ + \t{} -h | -v\n\ + \n\ + OPTIONS:\n\ + \tin-file Input file ('-' for stdin)\n\ + \tout-file Output file\n\ + \t-h Show this help information\n\ + \t-v Show version information", + env!("CARGO_PKG_NAME"), env!("CARGO_PKG_NAME")); +} fn main() -> io::Result<()> { let args:Vec = env::args().collect(); + let mut in_path:Option<&str> = None; + let mut out_path:Option<&str> = None; if args.len() < 2 || args.len() > 3 { - eprintln!("Usage: {} [out-file]", args[0]); + eprintln!("Invalid number of arguments. Use -h for more information."); + print_usage(); process::exit(1); } - let mut in_reader:Box; - if args[1] == "-" { - in_reader = Box::new(io::stdin()); - } else { - let in_file = fs::File::open(&args[1])?; - in_reader = Box::new(io::BufReader::new(in_file)); - } - - let mut out_writer:Box; - if args.len() == 3 { - let out_file = fs::File::create(&args[2])?; - out_writer = Box::new(io::BufWriter::new(out_file)); - } else { - out_writer = Box::new(io::stdout()); - } - - let mut read_buf:[u8; BLOCK_SIZE] = [0; BLOCK_SIZE]; - let mut last_ch:char = '\0'; - let mut tab_num = 0; - - while in_reader.read(&mut read_buf)? > 0 { - for i in read_buf { - let ch = i as char; - match ch { - '[' | '{' => { - tab_num += 1; - out_writer.write(format!("{}\n", ch).as_bytes())?; - for _ in 0..tab_num { - out_writer.write(b" ")?; - } - last_ch = ' '; - }, - ']' | '}' => { - tab_num -= 1; - out_writer.write(b"\n")?; - for _ in 0..tab_num { - out_writer.write(b" ")?; - } - out_writer.write(format!("{}", ch).as_bytes())?; - last_ch = ch; - }, - ',' => { - out_writer.write(format!("{}\n", ch).as_bytes())?; - for _ in 0..tab_num { - out_writer.write(b" ")?; - } - last_ch = ' '; - }, - _ => { - let ch = ch; - if ch != ' ' || last_ch != ' ' { - out_writer.write(format!("{}", ch).as_bytes())?; - last_ch = ch; - } - }, - } + for i in &args { + if i == "-h" { + print_help(); + return Ok(()); + } else if i == "-v" { + print_version(); + return Ok(()); + } else if i.starts_with("-") && i != "-" { + eprintln!("Invalid argument '{}'. Use -h for help information.", i); + process::exit(1); } } - out_writer.flush()?; + if args[1] != "-" { + in_path = Some(args[1].as_str()); + } + if args.len() == 3 { + out_path = Some(args[2].as_str()); + } - Ok(()) + work(in_path, out_path) } diff --git a/src/worker.rs b/src/worker.rs new file mode 100644 index 0000000..2898110 --- /dev/null +++ b/src/worker.rs @@ -0,0 +1,77 @@ +use std::io; +use std::fs; +use std::io::Read; +use std::boxed::Box; + +// Read 1KiB of the file at a time. +static BLOCK_SIZE:usize = 1024; + +pub fn work(in_path:Option<&str>, out_path:Option<&str>) -> io::Result<()> { + let mut in_reader:Box = match in_path { + Some(x) => { + let in_file = fs::File::open(x)?; + Box::new(io::BufReader::new(in_file)) + }, + None => { + Box::new(io::stdin()) + }, + }; + + let mut out_writer:Box = match out_path { + Some(x) => { + let out_file = fs::File::create(x)?; + Box::new(io::BufWriter::new(out_file)) + }, + None => { + Box::new(io::stdout()) + }, + }; + + let mut read_buf:[u8; BLOCK_SIZE] = [0; BLOCK_SIZE]; + let mut last_ch:char = '\0'; + let mut tab_num = 0; + + while in_reader.read(&mut read_buf)? > 0 { + for i in read_buf { + let ch = i as char; + match ch { + '[' | '{' => { + tab_num += 1; + out_writer.write(format!("{}\n", ch).as_bytes())?; + for _ in 0..tab_num { + out_writer.write(b" ")?; + } + last_ch = ' '; + }, + ']' | '}' => { + tab_num -= 1; + out_writer.write(b"\n")?; + for _ in 0..tab_num { + out_writer.write(b" ")?; + } + out_writer.write(format!("{}", ch).as_bytes())?; + last_ch = ch; + }, + ',' => { + out_writer.write(format!("{}\n", ch).as_bytes())?; + for _ in 0..tab_num { + out_writer.write(b" ")?; + } + last_ch = ' '; + }, + _ => { + let ch = ch; + if ch != ' ' || last_ch != ' ' { + out_writer.write(format!("{}", ch).as_bytes())?; + last_ch = ch; + } + }, + } + } + } + + out_writer.flush()?; + + Ok(()) + +}