grsh/src/grep.rs

51 lines
1.5 KiB
Rust
Raw Permalink Normal View History

2021-07-22 10:39:11 +00:00
use std::env;
use std::fs::{self, File};
//use std::path::Path;
//use std::io::BufReader;
//use std::io::stdout;
//use std::io::prelude::*;
2021-08-28 18:41:11 +00:00
fn main() {
2021-07-22 10:39:11 +00:00
let args: Vec<String> = env::args().collect();
let mut pattern_and_filename: Vec<String> = Vec::new(); // 0 - pattern, 1 - name of files
2021-07-23 08:43:49 +00:00
let mut invert: bool = false;
2021-08-28 18:41:11 +00:00
2021-07-22 10:39:11 +00:00
for arg in 1..args.len() {
match args[arg].as_str() {
"--help" => {
println!("Usage: grep [OPTIONS] FILE");
println!("Print lines matching a pattern");
return;
2021-08-28 18:41:11 +00:00
}
2021-07-23 08:43:49 +00:00
"-v" => {
invert = true;
2021-08-28 18:41:11 +00:00
}
2021-07-22 10:39:11 +00:00
arg => {
if args.len() < 3 {
println!("grep: Not enought arguments");
return;
2021-08-28 18:41:11 +00:00
}
2021-07-22 10:39:11 +00:00
pattern_and_filename.push(arg.to_string());
2021-08-28 18:41:11 +00:00
}
2021-07-22 10:39:11 +00:00
}
}
let pattern = &pattern_and_filename[0];
let filename = &pattern_and_filename[1];
let contents = fs::read_to_string(&filename);
2021-07-23 08:43:49 +00:00
for line in search(pattern.to_string(), contents.unwrap().as_str(), invert) {
2021-07-22 10:39:11 +00:00
println!("{}", line);
}
}
2021-07-23 08:43:49 +00:00
fn search<'a>(pattern: String, contents: &'a str, invert: bool) -> Vec<&'a str> {
2021-07-22 10:39:11 +00:00
let mut results = Vec::new();
for line in contents.lines() {
2021-07-23 08:43:49 +00:00
if line.contains(&pattern) && !invert {
results.push(line);
2021-08-28 18:41:11 +00:00
} else if !line.contains(&pattern) && invert {
2021-07-22 10:39:11 +00:00
results.push(line);
}
}
results
}