rust_main_abel_test/
lib.rs1use std::{error::Error, fs, vec};
5
6#[derive(Debug)]
7pub struct Config {
8 pub query: String,
9 pub filename: String,
10}
11
12pub fn read_string(path: &str) -> Result<String, std::io::Error> {
21 let str = fs::read_to_string(path)?;
22 Ok(str)
23}
24
25pub fn parse_config(args: &Vec<String>) -> Result<Config, &'static str> {
26 if args.len() < 3 {
27 return Err("not enough arguments");
28 }
29 let query = args[1].clone();
30 let filename = args[2].clone();
31 Ok(Config { query, filename })
32}
33
34pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
35 let content = read_string(&config.filename)?;
36 for line in search(&config.query, &content) {
37 println!("{}", line)
38 }
39 Ok(())
40}
41
42pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
43 let mut results = vec![];
44 for line in contents.lines() {
45 if line.contains(query) {
46 results.push(line);
47 }
48 }
49 results
50}
51
52#[cfg(test)]
53mod tests {
54 use super::*;
55 #[test]
56
57 fn case_sensitive() {
58 let query = "rust";
59 let contents = "
60Rust
61safe, fast, productive.
62Pick three.
63";
64 let res = search(query, contents);
65 assert_eq!(vec!["Rust"], res);
66 }
67}