Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 53 additions & 16 deletions src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,42 +1,69 @@
use std::error::Error;
use std::fs;
use std::env;

pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
// Open the file given in filepath
let file_content = fs::read_to_string(config.file_path)?;

println!("{file_content}");
let results = if config.ignore_case {
search_case_insensitive(&config.query, &file_content);
} else {
search(&config.query, &file_content);
};

// for line in results {
// println!("{line}");
// }

println!("{:?}", results);

Ok(())
}

pub struct Config {
query: String,
file_path: String,
ignore_case: bool,
}

impl Config {
pub fn build(args: &[String]) -> Result<Config, &'static str> {
pub fn build(
mut args: impl Iterator<Item = String>) -> Result<Config, &'static str> {

args.next();

if args.len() < 3 {
return Err("Not enough arguments!");
}
let query = match args.next() {
Some(arg) => arg,
None => return Err("Didn't get a string"),
};

let query = args[1].clone();
let file_path = args[2].clone();

Ok(Config {query, file_path})
let file_path = match args.next() {
Some(arg) => arg,
None => return Err("Didn't get a file path."),
};


let ignore_case = env::var("IGNORE_CASE").is_ok();

Ok(Config {query, file_path, ignore_case})
}
}

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
}
contents
.lines()
.filter(|line| line.contains(query))
.collect()
}

pub fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
contents
.lines()
.filter(|line| line.to_lowercase().contains(&query.to_lowercase()))
.collect()
}

// Unit tests

Expand All @@ -53,4 +80,14 @@ safe, fast, productive.
Pick three.";
assert_eq!(vec!["safe, fast, productive."], search(query, contents));
}

#[test]
fn case_sensitive() {
let query = "rust";
let contents = "\
Rust:
safe, fast, productive.
Trust me.";
assert_eq!(vec!["Rust:", "Trust me."], search(query, contents));
}
}
2 changes: 0 additions & 2 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ mod inventory;
*/

fn main() {
// use std::evn::args to take input from command line and collect to turn iterator into collection.
let args: Vec<String> = env::args().collect();

// let config: Config = Config::build(&args).unwrap_or_else(|err| {
// println!("Reading Arguments Failed: {err}");
Expand Down