From 1890006df3d79a767bfdc1b981c658f7033d8fd2 Mon Sep 17 00:00:00 2001 From: Joursoir Date: Thu, 2 Mar 2023 23:22:23 +0400 Subject: accept multiple files and stdin --- src/main.rs | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/main.rs b/src/main.rs index 76b2543..767914d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ use std::error::Error; use std::process; use std::fs; +use std::io::{self, BufReader, BufRead}; use clap::Parser; @@ -9,12 +10,18 @@ use clap::Parser; struct Config { /// The pattern to look for pattern: String, - /// The path to the file to read - file: String, + /// The path to files to read. A path of "-" stands for standard input. + /// + /// If no FILE is given, read standard input. + files: Vec, } fn main() { - let config = Config::parse(); + let mut config = Config::parse(); + + if config.files.is_empty() { + config.files.push(String::from("-")); + } if let Err(e) = run(config) { eprintln!("Error: {e}"); @@ -23,10 +30,25 @@ fn main() { } fn run(config: Config) -> Result<(), Box> { - let contents = fs::read_to_string(config.file)?; + for file in config.files { + // On-Stack Dynamic Dispatch + let (mut stdin_read, mut file_read); + + // We need to ascribe the type to get dynamic dispatch. + let reader: &mut dyn BufRead = if file == "-" { + stdin_read = BufReader::new(io::stdin()); + &mut stdin_read + } else { + file_read = BufReader::new(fs::File::open(&file)?); + &mut file_read + }; + + let mut contents = String::new(); + reader.read_to_string(&mut contents)?; - for line in trgrep::search(&config.pattern, &contents) { - println!("{line}"); + for line in trgrep::search(&config.pattern, &contents) { + println!("{line}"); + } } Ok(()) -- cgit v1.2.3-18-g5258