From 5490f28e437dce426c0aff7dbbfafbf25fafddaf Mon Sep 17 00:00:00 2001 From: rsgl Date: Sun, 24 Nov 2024 23:29:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=20Config::build=20=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E4=BB=A5=E8=A7=A3=E6=9E=90=E5=91=BD=E4=BB=A4=E8=A1=8C?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=B9=B6=E6=9B=B4=E6=96=B0=E4=B8=BB=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E4=BB=A5=E4=BD=BF=E7=94=A8=E6=96=B0=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- minigrep/src/lib.rs | 61 +++++++++++++++++++++++++++++++++----------- minigrep/src/main.rs | 12 ++++++--- 2 files changed, 54 insertions(+), 19 deletions(-) diff --git a/minigrep/src/lib.rs b/minigrep/src/lib.rs index a5cbc19..2e9a8ce 100644 --- a/minigrep/src/lib.rs +++ b/minigrep/src/lib.rs @@ -8,6 +8,27 @@ pub struct Config { } impl Config { + pub fn build(mut args: impl Iterator) -> Result { + args.next(); + + let query = match args.next() { + Some(arg) => arg, + None => return Err("query not provided"), + }; + + let file_path = match args.next() { + Some(arg) => arg, + None => return Err("file path not provided"), + }; + + let ignore_case = env::var("IGNORE_CASE").is_ok(); + Ok(Config { + query, + file_path, + ignore_case, + }) + } + pub fn new(args: &[String]) -> Result { if args.len() < 3 { return Err("not enough arguments"); @@ -28,8 +49,10 @@ impl Config { pub fn run(config: Config) -> Result<(), Box> { let contents = fs::read_to_string(config.file_path)?; let results = if config.ignore_case { + println!("Ignoring case"); search_case_insensitive(&config.query, &contents) } else { + println!("Case sensitive"); search(&config.query, &contents) }; @@ -80,24 +103,32 @@ Trust me."; } pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { - let mut result = Vec::new(); - for line in contents.lines() { - if line.contains(&query) { - result.push(line); - } - } - result + // let mut result = Vec::new(); + // for line in contents.lines() { + // if line.contains(&query) { + // result.push(line); + // } + // } + // result + contents + .lines() + .filter(|line| line.contains(&query)) + .collect() } pub fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> Vec<&'a str> { - let query = query.to_lowercase(); - let mut result = Vec::new(); + // let query = query.to_lowercase(); + // let mut result = Vec::new(); - for line in contents.lines() { - if line.to_lowercase().contains(&query) { - result.push(line); - } - } + // for line in contents.lines() { + // if line.to_lowercase().contains(&query) { + // result.push(line); + // } + // } - result + // result + contents + .lines() + .filter(|line| line.to_lowercase().contains(&query.to_lowercase())) + .collect() } diff --git a/minigrep/src/main.rs b/minigrep/src/main.rs index 433af04..9854078 100644 --- a/minigrep/src/main.rs +++ b/minigrep/src/main.rs @@ -4,9 +4,13 @@ use std::process; use minigrep::Config; fn main() { - let args: Vec = env::args().collect(); - let config = Config::new(&args).unwrap_or_else(|err| { - println!("Problem parsing arguments: {}", err); + // let args: Vec = env::args().collect(); + // let config = Config::new(&args).unwrap_or_else(|err| { + // eprintln!("Problem parsing arguments: {}", err); + // process::exit(1); + // }); + let config = Config::build(env::args()).unwrap_or_else(|err| { + eprintln!("Problem parsing arguments: {}", err); process::exit(1); }); @@ -14,7 +18,7 @@ fn main() { println!("In file {}", config.file_path); if let Err(e) = minigrep::run(config) { - println!("Application error: {}", e); + eprintln!("Application error: {}", e); process::exit(1); } }