From cbca3bd0d86be20a50e78d1115d8ba8bb0a3854a Mon Sep 17 00:00:00 2001
From: Manuel Thalmann <m@nuth.ch>
Date: Wed, 26 Mar 2025 00:07:44 +0100
Subject: [PATCH] Initialize configuration using iterators

---
 minigrep/src/lib.rs  | 20 ++++++++++++++------
 minigrep/src/main.rs |  4 +---
 2 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/minigrep/src/lib.rs b/minigrep/src/lib.rs
index 10659e3..1092248 100644
--- a/minigrep/src/lib.rs
+++ b/minigrep/src/lib.rs
@@ -8,13 +8,21 @@ pub struct Config {
 }
 
 impl Config {
-    pub fn build(args: &[String]) -> Result<Config, &'static str> {
-        if args.len() < 3 {
-            return Err("not enough arguments");
-        }
+    pub fn build(
+        mut args: impl Iterator<Item = String>
+    ) -> Result<Config, &'static str> {
+        args.next();
+
+        let query = match args.next() {
+            Some(arg) => arg,
+            None => return Err("Didn't get a query string"),
+        };
+
+        let file_path = match args.next() {
+            Some(arg) => arg,
+            None => return Err("Didn't get a file path"),
+        };
 
-        let query = args[1].clone();
-        let file_path = args[2].clone();
         let ignore_case = env::var("IGNORE_CASE").is_ok();
 
         Ok(Config {
diff --git a/minigrep/src/main.rs b/minigrep/src/main.rs
index 50d3fe8..9ac0225 100644
--- a/minigrep/src/main.rs
+++ b/minigrep/src/main.rs
@@ -4,9 +4,7 @@ use std::process;
 use minigrep::Config;
 
 fn main() {
-    let args: Vec<String> = env::args().collect();
-
-    let config = Config::build(&args).unwrap_or_else(|err| {
+    let config = Config::build(env::args()).unwrap_or_else(|err| {
         eprintln!("Problem parsing arguments: {err}");
         process::exit(1);
     });